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

标签 c++ memory-management

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

例子:

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/

相关文章:

c++ - 嵌套容器的内存分配如何工作?

c - 检测到glibc-我的C程序中出现双重释放或损坏

c++ - 一个头文件中的多个类与每个类一个头文件

c++ - 容器模板参数 std::map 或 std::vector

c++ - 没有正则表达式库的简单正则表达式?

c++ - 使用文件锁的进程间的条件变量

ios - 由于存储在文档目录中的大量图像,应用程序正在接收内存警告。应用程序崩溃了

c++ - 检测进程内存是否被操纵?

c++ - 以独立于路径/安装/构建的方式了解资源路径的好方法

objective-c - 释放没有指针的对象?