对于C++中的指针,delete命令对内存有什么作用?

Gre*_*een 16 c++ memory-management new-operator

可能重复:
C++删除 - 删除我的对象,但我仍然可以访问数据?
可以在其范围之外访问局部变量的内存吗?

我不明白delete当我想释放分配的内存时真正做了什么new.在C++ Premiere一书中写道:

这将删除ps指针指向的内存; 它不会删除指针ps本身.例如,您可以重用ps来指向另一个新分配.你应该总是平衡使用new和使用delete; 否则,您可能会遇到内存泄漏 - 即已分配但无法再使用的内存.如果内存泄漏变得太大,它可能会使程序寻求更多的内存停止.

据我所知,delete必须删除pinter指向的内存中的值.但事实并非如此.这是我的实验:

int * ipt = new int;   // create new pointer-to-int

cout << ipt << endl;   // 0x200102a0, so pointer ipt points to address 0x200102a0
cout << *ipt << endl;  // 0, so the value at that address for now is 0. Ok, nothing was assigned
*ipt = 1000;     // assign a value to that memory address
cout << *pt << endl;   // read the new value, it is 1000, ok
cout << *((int *) 0x200102a0) << endl;   // read exactly from the address, 1000 too

delete ipt;   // now I do delete and then check
cout << ipt << endl;  // 0x200102a0, so still points to 0x200102a0
cout << *ipt << endl;  // 1000, the value there is the same
cout << *((int *) 0x200102a0) << endl;    // 1000, also 1000 is the value
Run Code Online (Sandbox Code Playgroud)

delete真的是什么呢?

Chr*_*ber 47

把记忆想象成一个大仓库,里面装着很多箱子.当你打电话给"新"时,仓库工作人员会发现一个大小足以满足你需要的未使用的盒子,将这个盒子记录为你所拥有的(所以它不会给别人),并给你那个盒子的号码,这样你就可以放你的东西.这个数字将是"指针".

现在,当您"删除"该指针时,相反的情况发生了:仓库工作人员注意到这个特定的盒子再次可用.与真正的仓库工作人员相反,他们没有对盒子做任何事情 - 所以如果你在"删除"后查看它,你可能会看到你的旧东西.或者你可能会看到别人的东西,如果盒子在此期间被重新分配的话.

从技术上讲,一旦你将它退回到游泳池,就不允许你查看你的盒子,但这是一个有点奇怪的仓库,没有钥匙或防护装置,所以你仍然可以随心所欲.但是,它可能会导致盒子的新所有者出现问题,因此您需要遵守规则.


pmr*_*pmr 7

undefined behavior只要在delete语句后取消引用指针,您的实验就会立即生效.一切都会发生,这使你的实验变得毫无价值.

是什么delete(不delete[])吗?它解除了其参数指向的存储空间.这将触发存储在该位置的对象的析构函数.访问已删除的存储会触发未定义的行为(通常是a segmentation fault).无法保证内存实际上已传回操作系统或其他任何内容.


Cod*_*ice 6

运算delete符释放先前使用运算符分配的内存new。这意味着该内存现在可供系统使用,例如当new程序中稍后有其他用途时。但是,它不会清除内存中的数据。指针仍将指向内存中的相同地址,但访问该块将导致未定义的行为。

最好在ing之后设置一个指向NULL(或nullptr在 C++11 中)的指针。delete任何后续的deletes 将是无害的。


小智 5

delete-ing之后取消引用指针是未定义的行为,因此任何事情都可能发生

通常,delete将内存标记为已释放,以便以后可以重用,但这是一个复杂的话题。

经验法则:从不使用newdelete直接使用(除了实现make_unique,标准由于某种原因缺乏);使用 RAII。


fre*_*low 5

delete使内存可用于以后的请求new.是否对内容进行争夺是不确定的.由于保留内容的速度比较快,因此在发布模式下,内存可能仍然"可用".在调试模式下,它可能会被魔术数字扰乱.

您在这里遇到的内容在C++中称为"未定义行为".在这种情况下,未定义的行为是由于在其生命周期结束后访问一块内存引起的.只是不要这样做.