2011-01-25 40 views
6

Tôi có một lớp mà trên đó tôi đang nạp chồng mới và xóa (bộ nhớ tìm nạp và trả về này và đến một vùng bộ nhớ). Điều làm tôi băn khoăn là lớp mà tôi đã quá tải vẫn có hàm hủy của nó được gọi trước khi hàm delete bị quá tải được gọi. Làm thế nào tôi có thể ngăn chặn điều này?Dừng trình hủy được gọi là

class Message 
{ 
    ~Message() { ... } 

    void* operator new(std::size_t sz) { ... } 
    void operator delete(void* ptr) { ... } 
}; 

EDIT:

Am đúng trong suy nghĩ rằng các thành viên của lớp sẽ được destructed nhưng bộ nhớ sẽ không được giải phóng bởi các hàm hủy; chức năng xóa sở hữu trách nhiệm này trong trường hợp nào tôi có thể ngăn chặn bộ nhớ bị deallocated?

OUTCOME: Penny giảm phân bổ/deallocation bộ nhớ và xây dựng/hủy là các mục riêng biệt. Bây giờ tôi có các destructors rỗng và quá tải mới/delete.

+2

Tôi không biết tại sao điều đó gây bực bội; C++ rất hợp lý trong vấn đề này. Để lại một destructor trống nếu bạn không cần nó để làm bất cứ điều gì. –

Trả lời

6

Hủy và phân bổ là hai thứ trực giao, người ta không nên ức chế người khác. Bạn sẽ làm gì với các phiên bản lớp của bạn đã được tạo trên ngăn xếp? Không dọn dẹp tài nguyên của họ? Bạn đang cố gắng phá vỡ một khái niệm rất hữu ích của RAII.

4

Tôi không nghĩ rằng bạn có thể ngăn chặn các destructor được gọi là, và tôi không chắc chắn lý do tại sao bạn sẽ muốn. Đối tượng phải được hủy trước khi bộ nhớ được giải phóng - nếu lớp cha được cấp phát một số tài nguyên, thì hàm hủy của nó phải giải phóng chúng trước khi bộ nhớ của đối tượng được giải phóng.

Chỉnh sửa sau khi chỉnh sửa: Có, trình phá hủy dọn dẹp mọi thứ mà chúng đã phân bổ nhưng không giải quyết bộ nhớ của đối tượng. Phương thức delete bạn đang viết thực hiện điều đó.

BTW, tên hay. :-)

3

Nếu bạn lo lắng về (a) grabbing bộ nhớ từ một hồ bơi cụ thể và (b) kiểm soát khi destructor được gọi là một lựa chọn là placement new:

void* raw = allocate(sizeof(Foo)); // line 1 
Foo* p = new(raw) Foo();   // line 2 

p->~Foo(); // explicitely call destructor 

(mã lấy từ trên liên kết với C++ FAQ)

0

Trả lời câu hỏi của bạn, có các nhà thầu và trình phá hủy được gọi là liệu bạn có quá tải mới/xóa hay không.

Trả lời câu hỏi mà bạn không hỏi, cho dù đó là giải pháp tốt để sử dụng các đối tượng có bộ nhớ, câu trả lời thường - "không". Những gì bạn muốn là các lớp của bạn, làm việc với bộ nhớ pool để có một lớp cấp phát. Nó cho phép nhiều tính linh hoạt hơn và thông thường bạn không chỉ có một lớp, nhưng nhiều thứ sẽ được đặt trong nhóm bộ nhớ, vì vậy bạn không muốn có quá tải khối lượng của tất cả các hàm mới/xóa. Ngoài ra, nó không phải là bất thường để có một số đề án phân bổ (và do đó phân bổ), nhưng bạn có thể quá tải mới/xóa chỉ một lần.

+0

Trả lời câu hỏi của bạn: làm thế nào để ngăn chặn việc gọi một destructor trong C++? Điều này có thể được thực hiện chỉ khi bạn đang sử dụng vị trí mới để phân bổ, trong trường hợp này, bạn (là một lập trình viên) phải chịu trách nhiệm gọi destructor theo cách thủ công (như Doug đã nói: p-> ~ Foo :: Foo() ;). Đó là trường hợp duy nhất trong ngôn ngữ khi một lập trình viên gọi hàm hủy bằng tay. – Viren

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