Tôi biết có các phương pháp để ngăn không cho lớp được tạo trên heap, bằng cách ngăn người dùng sử dụng toán tử new
và delete
. Tôi đang cố gắng làm điều ngược lại. Tôi có một lớp mà tôi muốn ngăn chặn người dùng tạo một thể hiện của nó trên ngăn xếp, và chỉ các trường hợp được xúi giục bằng toán tử new
sẽ biên dịch. Cụ thể hơn, tôi muốn đoạn mã sau để nhận được một lỗi trong quá trình biên soạn:C++, ngăn chặn cá thể lớp được tạo trên ngăn xếp (trong quá trình biên dịch)
MyClass c1; //compilation error
MyClass* c1 = new MyClass(); //compiles okay
Từ tìm kiếm trên web, tôi thấy đề nghị này về làm thế nào để làm điều đó:
class MyClass {
public:
MyClass();
private:
void destroy() const { delete this; }
...
private:
~MyClass();
};
int main(int argc,char** argv)
{
MyClass myclass; // <--- error, private destructor called here !!!
MyClass* myclass_ptr = new MyClass;
myclass_ptr->destroy();
}
Những gì tôi không hiểu là lý do tại sao điều này sẽ hoạt động. Tại sao destructor được gọi trong khi tạo một thể hiện của MyClass
?
bằng cách gọi hàm hủy() như thế này sẽ cung cấp cho bạn lỗi trình biên dịch vì nó được khai báo riêng –
Tôi muốn biết lý do bạn muốn điều này? – log0
xem câu hỏi khác của tôi, giải thích rõ ràng: http: // stackoverflow.com/questions/3095856/prevent-unaligned-data-on-the-heap – eladidan