我有一个类,其
constructor
将对象的地址作为参数。
MyClass(OtherClass * otherClass);
在本课程的
Destructor
中,我尝试 delete
OtherClass
的实例。
~MyClass() {
if(otherClass != nullptr) {
delete otherClass;
}
}
我遇到的问题是,当我调用它时
constructor
我用 stack
中的元素而不是 heap
中的元素来调用它,因此我将其称为如下:
MyClass myClass(&otherObject);
因此,当
myClass
对象超出范围时,我会得到一个异常。我怎样才能知道我的 OtherObject
变量是否是在 stack
或 heap
上声明的?或者换句话说,我怎么知道我是否可以delete
该物体?
虽然有系统特定的方法可能能够判断内存是来自堆还是来自堆栈,但这实际上并没有真正的帮助:您可能有一个指向堆上另一个对象的成员的指针。内存将位于堆上,但您仍然不负责删除该对象。换句话说:不要沿着你现在走的路走下去!
处理这个问题的正确方法是在界面中明确所有权语义并遵循这一点。您基本上可以采取两个方向:
std::unique_ptr<OtherClass>
。
delete
所有对象。调用者有责任不将指针传递给其他地方管理的对象,例如堆栈上的对象或成员对象。
std::shared_ptr<OtherClass>
,其正常构造将
delete
对象。当用户想要将指针传递给其他拥有的对象时,将使用删除器构造
std::shared_ptr<OtherClass>
,该删除器不会执行指针操作。这是一个简单的程序,演示了
delete
的两种不同管理策略:
std::shared_ptr