C++删除指针(空闲内存)

spa*_*ger 11 c++ pointers memory-management

请考虑以下代码:

int a = 10;
int * b = &a;
int * c = b;
delete b; // equivalent to delete c;
Run Code Online (Sandbox Code Playgroud)

我在最后一行是否正确理解,delete b并且delete c是等效的,并且两者都将释放内存空间a,因此a不再可访问?

Bat*_*eba 42

程序的行为未定义.您只能使用delete指向已使用分配的内存的指针new.如果你写过

int* b = new int;
*b = 10;
int* c = b;
Run Code Online (Sandbox Code Playgroud)

那么你可以任何 delete b; delete c;释放你的记忆.不要在电话会议之后或之后尝试取消引用,但这样做的行为也是未定义的.bcdelete

  • @GillBates这就是为什么原始*拥有*指针是危险的.非拥有指针很好. (9认同)
  • @NathanOliver如果你不使用智能指针而你是"新"的东西,那么你将拥有自己的指针.我们还没有谈到智能指针,所以当涉及到原始指针的危险时,我不打算提起它. (5认同)
  • 我不这么认为.为了得到一个弱指针,你需要一个共享指针,所以现在你有了原子引用计数.如果我只想从容器中返回一个元素,并且我想返回`null`如果它不存在那么原始指针就好了.智能指针有位置,但智能指针到处都不是恕我直言. (4认同)

Nat*_*ica 5

如果bc指向相同的内存,则删除其中任何一个都会释放内存,以便假设正确. a在这种情况下,变得不可访问是不正确的,因为你没有指向动态分配的内存,你只能调用delete/ delete[]上用new/ 创建的东西new[].尝试delete/ delete[]未使用new/ 分配的指针new[]是未定义的行为,通常会以分段错误结束.


UKM*_*key 5

令人困惑的部分是你的问题的答案

我在最后一行是否正确理解,删除b和删除c等效"

是的,它们是等价的,并且在这里其他地方都提到了UB.