bit*_*ask 4 c++ memory-management
我可以检查一个对象(通过指针或引用传递)是否是动态分配的?
例子:
T t;
T* pt = new T();
is_tmp(&t); // false
is_tmp(pt); // true
Run Code Online (Sandbox Code Playgroud)
我完全意识到这闻起来像是糟糕的设计,事实上确实如此,但我正在尝试扩展我不能(或不应该)修改的代码(当然我责怪不是我的代码;))。它调用一个方法(我可以重写),该方法将delete传递的对象以及仅适用于动态分配的对象的其他内容。现在,我想检查我是否有一些可以成为deleted 的东西,或者它是否是临时的。
我永远不会传递一个全局(或静态)变量,所以我在这里不定义它。
不便携。在 Solaris 或 PC 上的 Linux(至少 32 位 Linux)下,堆栈位于可用内存的最顶部,因此您可以将传入的地址与局部变量的地址进行比较:如果传入的地址高于局部变量,它指向的对象要么是局部变量,要么是临时的,要么是局部变量的一部分,要么是临时的。然而,这种技术会左右调用未定义的行为——它恰好适用于我提到的两个平台(并且可能适用于堆栈位于可用内存顶部并向下增长的所有平台)。
FWIW:您还可以检查这些机器上的静态。所有静态都在内存的底部,链接器end在它们的末尾插入一个符号。所以用这个名字声明一个外部数据(任何类型),并将地址与它进行比较。
然而,关于可能删除对象……仅仅知道对象不在堆上(也不是静态的)是不够的。该对象可能是更大的动态分配对象的成员。