1. 程式人生 > >effective c++條款16:成對使用new和delete時要採取相同形式

effective c++條款16:成對使用new和delete時要採取相同形式

下面的程式碼會產生什麼樣的後果?

#include <iostream>
using namespace std;
int main(void)
{
	std::string *StringArray = new std::string[30];
	delete StringArray;
	return 0;
}

答案就是有29個物件並沒有被delete掉,因為delete預設處理的是單個物件,所以後面29個物件的析構都沒有被呼叫;

那麼下面的程式碼呢?

#include <iostream>
using namespace std;
int main(void)
{
	std::string *StringArray = new std::string;
	delete[] StringArray;
	return 0;
}

注:一般在記憶體中陣列首元素的前面還會有一個包含陣列大小的元素,所以delete[]不需要大小說明。

答案就是delete[]會對非法記憶體進行訪問,因為delete[]會對若干個物件進行刪除。

解決方法就是將上面兩段程式碼的delete形式相互替換,同時只需記住:

如果非要使用陣列不可(容器一般夠用了),那麼new應該對應delete,new[]應該對應delete[]。