读书人

C++动态数组是空间开释

发布时间: 2012-09-19 13:43:53 作者: rapoo

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

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

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



[解决办法]
这一点C++ primer上说得不好.
虽然,大多数实现都可以回收内存(比如内部调用c的free).

这是未定义行为.
但是,在未定义行为这个大前提下,一切都得不到保证.包括回收内存.
[解决办法]
申请的内存在它前面有一个结构体来标识共分配了多少内存,哪个程序分配的,哪个函数分配的,等等的数据。在delete的时候,要先在parray减去一个偏移量来找到那个结构体,然后再删除。delete是先调用每个类的析构函数,然后再调用free()函数的,[]这个告诉delete要删除的是数组,而没这个,它也就只能执行一次析构函数了,如果可能的话。
[解决办法]
new/delete new[]/delete[]是分别配对的,如果使用new[],但释放对象时使用delete,则导致只会释放第一个对象,其他对象的行为是未定义的。可以阅读Effective C++的第五个条款
[解决办法]

探讨

new/delete new[]/delete[]是分别配对的,如果使用new[],但释放对象时使用delete,则导致只会释放第一个对象,其他对象的行为是未定义的。可以阅读Effective C++的第五个条款

读书人网 >C++

热点推荐