Effective c++学习笔记(item16)对成对的new和delete使用相同的形式
new 和new[] 出来的内存组织形式不同
new出单一对象和new出对象数组,有个关键的区别在于在new出对象数组的时候会在new出的内存块中有个地方会记录数组的个数。delete 和delete[]的区别在于是否读取这个记录个数的地方,并按照个数进行多个连续对象的delete。如果不成对出现,出现问题很明显。可以用下面的示例充分说明问题。
class TestUnit
{
~TestUnit(){cout<<"release one unit"<<endl;}
}
int main()
{
TestUnit* pUnitArray = new TestUnit[5];
//delete pUnitArray; //错误的释放语句
delete[] pUnitArray; //使用delete[]你才能观察到5个"release one unit"语句。
}
需要特别注意的两个场景
- 如果你设计一个class,这个class有多个构造函数,每个构造函数里面都会给一个相同的成员指针new出资源。 然后这个class只有一个析构函数,那么你要保证每个构造函数的new方式一致,且和唯一一个析构里面的delete方式一致。
- 如果你使用类似’typedef string address[4]’的语句,那么极其容易引发问题。’typedef string address[4]’这个typedef的意思,定义address这种新的数组元素类型,单个元素是string,数组个数是4个。引发的问题见下面代码注释
typedef string address[4];
string* pStringArray = new address;//相当于new string[4];
delete[] pStringArray;//对于其他协同开发者,对方可不一定能知道你的new address是new string[4]的意思。所以他们调用`delete pStringArray'的可能性更大从而导致出错。
最好的建议是c++上避免使用数组。
网友评论