Gre*_*een 16 c++ memory-management new-operator
我不明白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
把记忆想象成一个大仓库,里面装着很多箱子.当你打电话给"新"时,仓库工作人员会发现一个大小足以满足你需要的未使用的盒子,将这个盒子记录为你所拥有的(所以它不会给别人),并给你那个盒子的号码,这样你就可以放你的东西.这个数字将是"指针".
现在,当您"删除"该指针时,相反的情况发生了:仓库工作人员注意到这个特定的盒子再次可用.与真正的仓库工作人员相反,他们没有对盒子做任何事情 - 所以如果你在"删除"后查看它,你可能会看到你的旧东西.或者你可能会看到别人的东西,如果盒子在此期间被重新分配的话.
从技术上讲,一旦你将它退回到游泳池,就不允许你查看你的盒子,但这是一个有点奇怪的仓库,没有钥匙或防护装置,所以你仍然可以随心所欲.但是,它可能会导致盒子的新所有者出现问题,因此您需要遵守规则.
undefined behavior只要在delete语句后取消引用指针,您的实验就会立即生效.一切都会发生,这使你的实验变得毫无价值.
是什么delete(不delete[])吗?它解除了其参数指向的存储空间.这将触发存储在该位置的对象的析构函数.访问已删除的存储会触发未定义的行为(通常是a segmentation fault).无法保证内存实际上已传回操作系统或其他任何内容.
运算delete符释放先前使用运算符分配的内存new。这意味着该内存现在可供系统使用,例如当new程序中稍后有其他用途时。但是,它不会清除内存中的数据。指针仍将指向内存中的相同地址,但访问该块将导致未定义的行为。
最好在ing之后设置一个指向NULL(或nullptr在 C++11 中)的指针。delete任何后续的deletes 将是无害的。
小智 5
在delete-ing之后取消引用指针是未定义的行为,因此任何事情都可能发生。
通常,delete将内存标记为已释放,以便以后可以重用,但这是一个复杂的话题。
经验法则:从不使用new和delete直接使用(除了实现make_unique,标准由于某种原因缺乏);使用 RAII。
delete使内存可用于以后的请求new.是否对内容进行争夺是不确定的.由于保留内容的速度比较快,因此在发布模式下,内存可能仍然"可用".在调试模式下,它可能会被魔术数字扰乱.
您在这里遇到的内容在C++中称为"未定义行为".在这种情况下,未定义的行为是由于在其生命周期结束后访问一块内存引起的.只是不要这样做.
| 归档时间: |
|
| 查看次数: |
15133 次 |
| 最近记录: |