2010-04-20 42 views
7

Khi phân bổ một BSTR mới với SysAllocString thông qua một wchar_t * trên heap, sau đó tôi nên giải phóng wchar_t ban đầu * trên heap?Tôi có thể giải phóng bộ nhớ cho SysAllocString không?

Vậy đây có phải là cách phù hợp không?

wchar_t *hs = new wchar_t[20]; 
// load some wchar's into hs... 
BSTR bs = SysAllocString(hs); 
delete[] hs; 

Tôi có nên gọi xóa tại đây để giải phóng bộ nhớ không? Hay là bộ nhớ đó đã được BSTR chấp nhận?

+0

Kind of hài hước - Tôi hoàn toàn không nhận định các biến khi tôi đăng câu trả lời của tôi (mà tôi sau đó bị xóa). Tôi "thấy" xóa [] bs; thay vì hs. Tôi phải cần kính mới. –

Trả lời

9

Như tên gọi của nó, SysAllocString cấp phát bộ nhớ của nó, nó không "chấp nhận" bộ nhớ đối số của nó. BSTR có tiền tố có kích thước là không được kết thúc, vì vậy "việc chấp nhận" một chuỗi kiểu c là không thể, vì không có khoảng trống cho tiền tố kích thước.

3

Có, delete bộ nhớ.

10

SysAllocString(), từ documentation, cư xử như thế này:

chức năng này phân bổ một chuỗi mới và bản sao chuỗi truyền vào nó.

Vì vậy, có, một khi bạn đã gọi SysAllocString bạn có thể giải phóng mảng ký tự ban đầu của mình, vì dữ liệu đã được sao chép vào BSTR mới được phân bổ.

Cách thích hợp để giải phóng một chuỗi wchar_t được phân bổ với new[] là sử dụng delete[].

wchar_t *hs = new wchar_t[20]; 
... 
delete[] hs; 

Cách đúng đắn để giải phóng một BSTR là với SysFreeString():

BSTR bs = SysAllocString(hs); 
... 
SysFreeString(bs); 

Trong khi bạn là người mới đến BSTRs, bạn nên đọc Eric's Complete Guide to BSTR Semantics.

3

The docs for SysAllocString() là khá rõ ràng:

chức năng này phân bổ một chuỗi mới và sao chép chuỗi truyền vào nó.

Dữ liệu chuỗi bạn truyền vào được sao chép - SysAllocString() không sử dụng sau khi hoàn thành - bạn được tự do chia sẻ hoặc sửa đổi bộ đệm đó.

0

Để chuyển đổi wchar_t* để OLECHAR* bạn cần phải sử dụng W2OLE vĩ mô:

wchar_t *hs = new wchar_t[20]; 
USES_CONVERSION; 
BSTR bs = SysAllocString(W2OLE(hs)); 
delete[] hs; // no need in hs anymore since SysAllocString allocates memory 
... 

SysFreeString(bs); // delete Sys string 
Các vấn đề liên quan