删除指针

ano*_*non 4 c++ pointers

我想问一下,是动态创建指针,然后将指针地址更改为仍然删除原始分配空间的其他内容?

例如:

int main()
{

int c = 50;
    // Memory leak
    int * q = new int;
    q = & c;
    delete q;
}
Run Code Online (Sandbox Code Playgroud)

究竟是什么被删除或发生?

谢谢!

Fan*_*Fox 7

内存泄漏和未定义的行为.

当你这样做时,q = & c;你正在失去你所分配的内存的唯一跟踪new int.没有人为你追踪这个,没有垃圾收集器,它只是丢失了,无法恢复.

然后执行delete q;(q分配到的位置&c)时,删除未分配的内存,更糟糕的是删除堆栈中的内存.这两种情况都会导致未定义的行为.


这是一个很好的前言,为什么你应该避免在不需要指针的情况下使用指针.在这种情况下,没有理由动态分配你的int.如果你真的需要一个指针,请使用c++11智能指针(或者boost如果你没有c++11).在极少数情况下,您确实需要原始c类型指针.您应该阅读Effective Modern c ++第4章,了解有关此主题的详细信息.


Cal*_*leb 5

动态创建一个指针,然后将指针地址更改为其他内容仍然会删除原始分配的空间?

No. delete将释放其操作数指向的内存。您必须delete使用从 获得的同一块内存new。

int c = 50;
int * q = new int;
int * r = q;
q = & c;
delete q;     // WRONG! q points to something you didn't get from new
delete r;     // OK! p points to the block you got from new
Run Code Online (Sandbox Code Playgroud)

更清楚地说,delete它不关心它操作的变量是什么,它只关心该变量指向什么。在上面的最后一行中,r指向最初由 指向q并由 分配的块new,因此您可以安全地使用delete它。q指向静态分配的内存,而不是您从 获得的内存new,因此您不能 delete这样做。

q不过,您可以将所需的值复制到指向的空间中,而不是更改指向的位置q:

int c = 50;
int * q = new int;
*q = c;
delete q;     // OK! q still points to the same place
Run Code Online (Sandbox Code Playgroud)

在这里,您将更改存储在指向的位置中的值q,但不会更改q其本身。q仍然指向你从 获得的块new,所以它是安全的delete。