C++-关于C++动态数组空间释放
《C++ Primer()第三版》第14 章 练习14.11
使用动态数组的一个潜在缺点是,我们时常忘记放上一个方括号以表明指针指向一个数组,即写成:
delete parray;//error
而不是:
delete[] parray;//OK
方括号的存在会使编译器获取数组的大小。然后析构函数再一次应用在每个元素上,一共size次。否则,只有一个元素被析构。无论哪种情况下,分配的全部空间都被返回给自由存储区。
我不明白的就是,如果没有加方括号不是应该导致内存泄露吗?为什么两种情况下分配的全部空间都被返回给自由存储区呢?求解答~~~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对于泛类型,数组中存储的是数量为 size 个类型为 T 的元素,调用delete [],首先调用 size次 T::~T 来析构数组中的每个构造好的对象, 然后调用 delete [] / delete [] () 来回收内存。
对于基本类型,delete 和 delete[]都是一样的, 但是对于对象来说,delete可能会导致内存泄漏。因为不delete不会调用每一个元素的析构函数。
详请请看:C++中delete和delete[]
一個對象釋放過程可以分成兩部:
1 調用析構函數
2 將分配的內存還給內存分配器
對於對象數組的釋放,添加了一個過程,即調用析構函數之前,查找數組內對象的個數,並確認整個數組的大小
然後分別調用每個對象的析構函數,然後將內存還給內存分配器。
對於沒有正確使用delte[]的情況, 在運行時,會將對象數組的指針當作一個對象的指針,從而調用該對象的析構函數,然後釋放該對象的內存,導致對象數組內其他對象的析構函數沒有得到調用,齊內存也沒有還給內存分配器。
其实他指的意思是: 如果是对象数组, 而对象数组中的对象又含有动态分配的内存, 我们可能在析构函数里面释放对象中动态分配的内存, 而不加[]会导致数组后面的对象没有调用析构函数, 这样只是释放了分配的对象数组的内存, 而对象数组中的对象中动态分配的内存却没有正确释放,造成内存泄露