检查内存是否在Heap上? [重复]

问题描述 投票:0回答:1

我有一个类,其

constructor
将对象的地址作为参数。

MyClass(OtherClass * otherClass);

在本课程的

Destructor
中,我尝试
delete
OtherClass
的实例。

~MyClass() {
    if(otherClass != nullptr) {
        delete otherClass;
    }
}

我遇到的问题是,当我调用它时

constructor
我用
stack
中的元素而不是
heap
中的元素来调用它,因此我将其称为如下:

MyClass myClass(&otherObject);

因此,当

myClass
对象超出范围时,我会得到一个异常。我怎样才能知道我的
OtherObject
变量是否是在
stack
heap
上声明的?或者换句话说,我怎么知道我是否可以
delete
该物体?

c++ memory-management
1个回答
6
投票

虽然有系统特定的方法可能能够判断内存是来自堆还是来自堆栈,但这实际上并没有真正的帮助:您可能有一个指向堆上另一个对象的成员的指针。内存将位于堆上,但您仍然不负责删除该对象。换句话说:不要沿着你现在走的路走下去!

处理这个问题的正确方法是在界面中明确所有权语义并遵循这一点。您基本上可以采取两个方向:

    您的类可以故意
  1. 接管构造函数中传递的指针的责任!相反,类的用户有责任处理这些对象,以保证它们在您的对象存在时有效。如果您可以获得指向堆栈(或成员)对象的指针,则用户无论如何都必须保证这些对象的有效性,并且对于其他方式来说,user处理它们可能是完全微不足道的,例如,通过通过std::unique_ptr<OtherClass>
  2. 你的类负责传递的
  3. 所有对象,并且它将delete
    所有对象。调用者有责任
    将指针传递给其他地方管理的对象,例如堆栈上的对象或成员对象。
有一种混合方法,您的类有时但并非总是负责对象。然而,这种方法的实现实际上是上述两种方法的组合:您将采用合适的智能指针作为构造函数参数,并且用户有责任确保智能指针是由您的用户正确构造的。班级。例如,您的类可以采用

std::shared_ptr<OtherClass>

,其正常构造将 
delete
 对象。当用户想要将指针传递给其他拥有的对象时,将使用删除器构造 
std::shared_ptr<OtherClass>
 ,该删除器不会执行指针操作。这是一个简单的程序,演示了 
delete 的两种不同管理策略:
std::shared_ptr

© www.soinside.com 2019 - 2024. All rights reserved.