来自堆的指针和来自堆栈的实例 C++

问题描述 投票:0回答:1

我的目的是确定是否应该使用delete将变量释放到存储在链表中的指针...

我的想法是,在堆中分配的任何指针都将严格优于使用的第一个“新”指针...并且在任何过程调用的任何kevel处存储在堆栈中的任何变量都将低于第一个指针分配“新”...

我试过了:

void main()

     { int A;
       int *b = new int;

       cout << &A << '\t' << b;
     }

在我的电脑上,它输出:

0x0019FE9C     0x0236542C

那就是

b > a
.... 所以在 Windows 10 上看起来是正确的...

这是一种错觉还是真的正确且可移植?

c++ pointers stack heap
1个回答
0
投票

由于多种原因,您的策略存在缺陷。

即使您可以可靠地比较两个不指向同一数组元素的指针(您不能),也存在以下问题:

#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。

© www.soinside.com 2019 - 2024. All rights reserved.