我可以检查一个对象(通过指针或引用传递)是否是动态分配的吗?
例子:
T t;
T* pt = new T();
is_tmp(&t); // false
is_tmp(pt); // true
上下文
我完全意识到这闻起来像糟糕的设计,事实上确实如此,但我正在尝试扩展我不能(或不应该)修改的代码(当然我责怪代码不是我的 ;))。它调用一个方法(我可以覆盖),该方法将删除
传递的对象以及仅适用于动态分配对象的其他内容。现在,我想检查我是否有可以删除
的东西,或者它是否是临时的。
我永远不会传递全局(或静态)变量,所以我在这里保留未定义。
最佳答案
不可移植。在 PC 上的 Solaris 或 Linux 下(至少 32 位 Linux), 堆栈位于可用内存的最顶部,因此您可以比较 address 传递给局部变量的地址:如果地址 传入的是高于局部变量的,它的对象 指向的是局部变量或临时变量,或者是 局部变量或临时变量。然而,这种技术会调用未定义的 左右行为——恰好对两者起作用 我提到的平台(并且可能会在所有平台上运行 堆栈位于可用内存的顶部并向下增长)。
FWIW:您还可以检查这些机器上的静态信息。所有静力学是
在内存底部,链接器插入一个符号 end
他们结束了。所以用这个名字声明一个外部数据(任何类型),
并将地址与其进行比较。
关于可能删除对象,但是......只是知道 对象不在堆上(也不是静态的)是不够的。这 对象可能是更大的动态分配对象的成员。
关于c++ - 检测动态分配的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7434062/