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

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

甜柠檬 发布于 2017-01-17 字数 510 浏览 1346 回复 4

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

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

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

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

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

评论(4

清晨说ぺ晚安 2017-10-25 4 楼

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

瑾兮 2017-10-15 3 楼

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

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

甜柠檬 2017-10-01 2 楼

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

偏爱自由 2017-03-24 1 楼

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