一、概述
在使用new的时候做了两件事:
1、调用operator new分配空间
2、调用构造函数初始化对象
在使用delete的时候也做了两件事:
1、调用析构函数清理对象
2、调用operator delete函数释放空间
在使用new[N]的时候也做了两件事:
1、调用operator new分配空间
2、调用N次构造函数初始化N个对象
在使用delete[]的时候也做了两件事:
1、调用N次析构函数清理N个对象
2、调用operator delete函数释放空间
二、几个相关问题
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?
- new 和 delete 是函数吗?
- new [] 和 delete [] 又是什么?什么时候用它们?
- 你知道 operator new 和 operator delete 吗?
- 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?
具体内容和内部分析请参考:https://blog.csdn.net/hazir/article/details/21413833
问:什么情况下new[]出来的数组可以使用delete释放?
// String 的析构函数
String::~String(void)
{
delete [] m_data;
// 由于m_data 是内部数据类型,也可以写成 delete m_data;
}
// String 的普通构造函数
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1];
*m_data = ‘\0’;
}
else
{
int length = strlen(str);
m_data = new char[length+1];
strcpy(m_data, str);
}
}
上面析构函数内delete m_data不是只释放一个单元么?
不是, 对于 char, int, float…等等内部数据类型, delete 和 delete[] 一样,但对于类就大有不同。
比如 char* p = new char[128]; delete p; 和 delete[] p; 效果一样,p的所有内存都释放了。
delete 和 delete[] 的不同之处在对class 的释放, delete只会调用一个元素的析构函数,而delete[]则调用所有元素的析构。
比如
class t
{
~t() {};
};
t* p = new t[128];
delete p;
和
delete[] p
内部都会调用operator delete()释放p的所有(128个)元素, 但 delete是调用了第一个元素的析构, 而delete[] 则是正确的调用128个元素的析构。
总的来说,记住一点即可:new/delete、new[]/delete[] 要配套使用总是没错的!
参考资料:
http://blog.51cto.com/11142019/1846844
https://blog.csdn.net/hazir/article/details/21413833
http://www.myexception.org/cpp/556220.html