2011-08-17 30 views
8

Tôi đã đọc ví dụ sau MSKB và chúng thực hiện xóa trên đối tượng được quản lý.Khi nào nên xóa được gọi trên một đối tượng được cấp gcnew?

Tôi đã bị ấn tượng rằng bạn không bao giờ nên xóa một đối tượng thu thập được thu gom thay vì bạn phải để nó cho người thu gom rác.

Tôi đã bỏ lỡ điều gì?

Phương pháp 4

//#include <msclr/marshal.h> 
//using namespace msclr::interop; 
marshal_context^context = gcnew marshal_context(); 
const char* str4 = context->marshal_as<const char*>(str); 
puts(str4); 
delete context; 

Trả lời

11

delete trong C++/CLI chỉ gọi phương thức Dispose trên một đối tượng quản lý, nếu nó thực hiện các giao diện System::IDisposable – nếu không, nó có hiệu quả một noop. Thực tế, nếu bạn cố gắng gọi phương thức Dispose trên chính đối tượng được quản lý, bạn sẽ gặp lỗi biên dịch – delete là thành ngữ được thực thi để xử lý đối tượng.

Để rõ ràng, nó không liên quan gì đến việc quản lý bộ nhớ, lưu ý rằng hầu hết các đối tượng cuối cùng sẽ được GCed sớm hơn nếu chúng được xử lý.

+0

Vì vậy, sau đó đánh dấu đối tượng cho GC ngay lập tức hơn không thực sự có lý do nào tốt để sử dụng xóa trong ví dụ trên? – TownCube

+2

@Cube: Không, việc kết thúc hợp đồng 'IDisposable' của bạn là một lý do tuyệt vời để ** luôn luôn ** sử dụng' xóa' bất cứ khi nào bạn hoàn thành một đối tượng. Hoặc tốt hơn, sử dụng ngữ nghĩa stack cho mô phỏng RAII, do đó bạn không bao giờ phải sử dụng 'delete', và' Dispose' sẽ tự động được gọi ngay sau khi các đối tượng đi ra khỏi phạm vi. – ildjarn

Các vấn đề liên quan