我的目的是确定是否应该使用delete将变量释放到存储在链表中的指针...
我的想法是,在堆中分配的任何指针都将严格优于使用的第一个“新”指针...并且在任何过程调用的任何kevel处存储在堆栈中的任何变量都将低于第一个指针分配“新”...
我试过了:
void main()
{ int A;
int *b = new int;
cout << &A << '\t' << b;
}
在我的电脑上,它输出:
0x0019FE9C 0x0236542C
那就是
b > a
.... 所以在 Windows 10 上看起来是正确的...
这是一种错觉还是真的正确且可移植?
由于多种原因,您的策略存在缺陷。
即使您可以可靠地比较两个不指向同一数组元素的指针(您不能),也存在以下问题:
#include <iostream>
int main() {
int *b = new int;
int *c = b;
std::cout << b << '\t' << c << '\n';
}
b
和 c
具有相同的值。如果你只用指针的值来决定是否使用delete
,那么你要么删除它们,要么都不删除。
如果您
delete
都调用未定义的行为。如果你都不删除它们,就会出现泄漏。
这里的根本问题是对原始指针的错误期望。原始指针指向某个地方,就是这样。因此,如果您需要管理某个对象的生命周期,那么单独的原始指针无法做到这一点。
不要使用原始拥有指针。使用
std::list
、std::unique_ptr
和/或标准库提供的其他工具。在极少数情况下,您需要编写自己的生命周期管理代码,那么它必须集中到一个简单的 RAII 类来管理对象的生命周期,但仅此而已。
一些供进一步阅读的流行语:零规则、智能指针、所有权、无原始拥有指针、RAII。