2010-07-11 23 views
13

Nếu tôi có một nhà máy, tạo ra một đối tượng và trả về một con trỏ đến nó, những gì sẽ là một cách tốt hơn để xóa nó:Nơi để xóa một đối tượng được tạo bởi nhà máy?

By delete cuộc gọi trong mã "người sử dụng", hoặc bằng một DestructObject chức năng mới mà Tôi nên có cùng với nhà máy?

+1

Tùy thuộc vào người sở hữu đối tượng khi được tạo. Nhưng nó không bao giờ là một ý tưởng tốt để trả về một con trỏ vì nó có không có ngữ nghĩa quyền sở hữu liên kết với nó. –

Trả lời

13

Trong trường hợp chung, nhà máy có thể không sử dụng đồng bằng cũ new để phân bổ đối tượng. Nó có thể sử dụng đối tượng và/hoặc tổng hợp trang, malloc với vị trí new hoặc một thứ gì đó kỳ lạ hơn (ánh xạ bộ nhớ?). Có ít nhất ba cách để xử lý việc này mà tôi có thể nghĩ đến:

  1. Yêu cầu nhà máy cung cấp phương thức recycle khi bạn hoàn thành đối tượng.
  2. Trả lại một con trỏ thông minh biết cách loại bỏ đối tượng khi không còn người giới thiệu nào.
  3. Thực hiện toán tử delete tùy chỉnh trong chính đối tượng.

Tôi ngần ngại giới thiệu người khác vì tôi chưa đưa ra đủ suy nghĩ trong năm phút trước để đưa ra ý kiến ​​dứt khoát, nhưng tôi có xu hướng ưu tiên tùy chọn cuối cùng kết hợp với thông minh thông thường con trỏ như boost/tr1 :: shared_ptr.

+0

Hãy coi chừng đi qua các đối tượng qua ranh giới DLL với shared_ptr. Sử dụng một intrusive_ptr sau đó ... Tôi đã đi qua vấn đề đó một lần và phá hủy hy vọng của tôi rằng khi sử dụng shared_ptr, sau đó bạn luôn ở bên an toàn. – jdehaan

+1

@jdehaan: shared_ptr sẽ gọi 'delete' tùy chỉnh luôn ở bên" an toàn ". –

+0

+1 để tăng :: shared_ptr. Đó là cách tốt nhất để đi. –

1

Cách tốt nhất để xóa thủ công là not at all.

+2

Sarcasm không dịch tốt sang bất kỳ định dạng được ghi nào. Nó sẽ là lời khuyên tốt nhất để tránh nó và được cụ thể hơn là ẩn ý nghĩa trong các liên kết. Nhưng 1 cho con trỏ thông minh là một phương pháp có thể. –

0

Giải pháp linh hoạt nhất cho vấn đề này là lấy được lớp học của bạn từ một lớp cơ sở có chức năng "diệt" ảo. Một cái gì đó như thế này:

class IDisposable { 
public: 
    virtual void Release() = 0; 
}; 

Thông thường, các đối tượng đa hình nên có trình phá hủy ảo để hỗ trợ dọn dẹp đối tượng thích hợp. Tuy nhiên điều này là không đầy đủ, bởi vì nó không tính đến khả năng quản lý bộ nhớ khác nhau của các đối tượng.

Mặt khác, phương pháp này không yêu cầu sử dụng trình phá hủy ảo. Nó bây giờ được thay thế bởi Release chức năng mà cả hai: invokation của chính xác destructor và phát hành bộ nhớ bằng các phương tiện thích hợp.

chăm sóc của đối tượng destr

cả: hủy

Đối tượng trở về từ nhà máy sẽ thực hiện điều này "giao diện".

1

Mã sau đây cung cấp cơ hội không nghĩ đến ai nên xóa đối tượng mới được tạo ra.

class FooFactory 
{ 
public: 
    static std::auto_ptr<Foo> CreateInstance(); 
}; 

// transmit ownership of created object from factory to 'a' variable 
std::auto_ptr<Foo> a = FooFactory::CreateInstance(); 
// using the created object is not required 
FooFactory::CreateInstance(); 
Các vấn đề liên quan