gpt4 book ai didi

c++ - 检测动态分配的对象?

转载 作者:太空狗 更新时间:2023-10-29 20:30:18 25 4
gpt4 key购买 nike

我可以检查一个对象(通过指针或引用传递)是否是动态分配的吗?

例子:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com