C++-关于C++动态数组空间释放

发布于 2017-01-17 12:39:03 字数 313 浏览 1712 评论 4

《C++ Primer()第三版》第14 章 练习14.11
使用动态数组的一个潜在缺点是,我们时常忘记放上一个方括号以表明指针指向一个数组,即写成:
delete parray;//error
而不是:
delete[] parray;//OK

方括号的存在会使编译器获取数组的大小。然后析构函数再一次应用在每个元素上,一共size次。否则,只有一个元素被析构。无论哪种情况下,分配的全部空间都被返回给自由存储区。

我不明白的就是,如果没有加方括号不是应该导致内存泄露吗?为什么两种情况下分配的全部空间都被返回给自由存储区呢?求解答~~~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清晨说ぺ晚安 2017-10-25 23:20:50

对于泛类型,数组中存储的是数量为 size 个类型为 T 的元素,调用delete [],首先调用 size次 T::~T 来析构数组中的每个构造好的对象, 然后调用 delete [] / delete [] () 来回收内存。

瑾兮 2017-10-15 19:28:41

对于基本类型,delete 和 delete[]都是一样的, 但是对于对象来说,delete可能会导致内存泄漏。因为不delete不会调用每一个元素的析构函数。

详请请看:C++中delete和delete[]

甜柠檬 2017-10-01 16:18:26

一個對象釋放過程可以分成兩部:
1 調用析構函數
2 將分配的內存還給內存分配器
對於對象數組的釋放,添加了一個過程,即調用析構函數之前,查找數組內對象的個數,並確認整個數組的大小
然後分別調用每個對象的析構函數,然後將內存還給內存分配器。
對於沒有正確使用delte[]的情況, 在運行時,會將對象數組的指針當作一個對象的指針,從而調用該對象的析構函數,然後釋放該對象的內存,導致對象數組內其他對象的析構函數沒有得到調用,齊內存也沒有還給內存分配器。

偏爱自由 2017-03-24 23:54:45

其实他指的意思是: 如果是对象数组, 而对象数组中的对象又含有动态分配的内存, 我们可能在析构函数里面释放对象中动态分配的内存, 而不加[]会导致数组后面的对象没有调用析构函数, 这样只是释放了分配的对象数组的内存, 而对象数组中的对象中动态分配的内存却没有正确释放,造成内存泄露

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文