2010-03-03 41 views
5

Tôi có câu hỏi về cách giới hạn việc tạo đối tượng trên heap hoặc ngăn xếp? Ví dụ, làm thế nào để đảm bảo một đối tượng không sống trên heap? làm thế nào để đảm bảo một đối tượng không sống trên stack?giới hạn việc tạo đối tượng trên đống và ngăn xếp trong C++

Cảm ơn!

+0

xem http://stackoverflow.com/questions/1820069/public-operator-new-private-operator-delete-getting-c2248-can-not-access-priva –

Trả lời

12

Để ngăn việc tạo ngẫu nhiên đối tượng trên heap, hãy cung cấp cho toán tử riêng mới. Ví dụ:

class X { 
private: 
    void *operator new(size_t); 
    void *operator new[](size_t); 
}; 

Để ngăn việc tạo ngẫu nhiên trên ngăn xếp, hãy tạo riêng tư cho người xây dựng và cung cấp chức năng người bạn hoặc tĩnh thực hiện cùng chức năng. Ví dụ, đây cũng là loại hiện cả hai:

class X { 
public: 
    static X *New() {return new X;} 
    static X *New(int i) {return new X(i);} 
    void Delete(X *x) {delete x;} 
private: 
    X(); 
    X(int i); 
    ~X(); 
}; 
+0

Đẹp nhất; tất nhiên, nó có thể được phá vỡ bởi nghịch ngợm, sử dụng thừa kế. – xtofl

+0

Tôi không nghĩ rằng bạn có thể kế thừa từ 'X', bởi vì destructor riêng. Tuy nhiên, bạn không chắc chắn cách bạn làm việc xung quanh nó (tuy nhiên kinh nghiệm của tôi thường là bạn muốn hạn chế sự tạo trên đống cho một đối tượng giá trị không phù hợp với lớp cơ sở.). –

+0

Srry, Nếu tôi sai. Nhưng ngay cả khi chúng tôi muốn ngăn chặn việc tạo đối tượng trên heap, chúng ta vẫn không thể hoàn thành nó mà không làm cho "mới" riêng tư? Vẫn làm cho hàm tạo riêng tư và trả về đối tượng thông qua một số phương thức tĩnh. Có đúng không khi tạo đối tượng trên stack với cách tiếp cận này? – Manish

0

Dễ dàng hơn để đảm bảo đối tượng được tạo trên heap. Toán tử new luôn thực hiện điều đó. Sẽ khó khăn hơn để đảm bảo rằng đối tượng nằm trên ngăn xếp. Đối với các đối tượng nhỏ, việc tạo một đối tượng như MyType aObj; luôn sử dụng ngăn xếp. Đối với các đối tượng có các lớp chiếm một lượng lớn bộ nhớ, trình biên dịch có thể không sử dụng ngăn xếp.

2

Bạn có thể ngăn một đối tượng được khai báo với thời gian tự động ("trên stack") bằng cách làm cho constructor của nó tin và cung cấp một nhà máy (nhà máy trừu tượng hoặc phương pháp nhà máy) để kiểm soát việc tạo các đối tượng mới.

Bạn có thể cố gắng ngăn chặn một đối tượng được phân bổ động ("trên heap") bằng cách đặt riêng operator new riêng tư. Tuy nhiên, điều này không ngăn cản ai đó tạo một phiên bản lớp học của bạn bằng cách sử dụng vị trí new.

Tại sao bạn muốn kiểm soát cách phân bổ đối tượng của mình? Bạn đang cố giải quyết vấn đề gì?

1

Để ngăn chặn một đối tượng được phân bổ trên ngăn xếp xác định một destructor riêng. Điều này dẫn đến một lỗi biên dịch cho một đối tượng dựa trên stack, vì nó cấm cuộc gọi destructor ngầm khi một đối tượng dựa trên stack vượt quá phạm vi. Bạn sẽ cần triển khai phương thức hủy công khai, một thứ gì đó dọc theo các dòng:

void MyObject::destroy() const 
{ 
    delete this; 
} 

để làm sạch đối tượng được phân bổ trên heap. Hãy chắc chắn để đọc C++ FAQ cho một số cảnh báo.

Tương tự, để ngăn không cho một đối tượng được cấp phát trên heap, hãy đảm bảo xác định riêng toán tử new.

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