为什么“new”的不同使用方式会导致结果与“delete”不兼容?
我正在阅读有关内存的 C++ Primer Plus, 12.1.3,以及有关析构函数的一些内容真的让我感到困惑。
//Here is a default construtor of String class
String::String()
{
len = 0;
str = new char[1];
str[0] = ' ';
}
书上说,使用str = new char[1]not str = new char,两种方式分配相同的内存,但第二种与析构函数不兼容。此外,书中说以下3种方式不好,因为它们与“删除”不兼容
char words[15] = "bad idea";
char *p1 = words;
char *p2 = new char;
char *p3;
delete [] p1; //undefined, so don't do it
delete [] p2; //undefined, so don't do it
delete [] p3; //undefined, so don't do it
我不知道这 3 种方式有什么不同,有人可以向我解释一下吗?非常感谢。
回答
new char[1]分配一个长度为 1 的 char 数组,而new char分配一个单一的char,这些是根本不同的。
简而言之,无论何时使用,new您都可以delete用来释放分配的内存。任何时候你使用new[]你都会delete[]用来释放分配的内存,这只是规则。
请注意,虽然这作为一种学习练习很好,但现在有更合适的替代方案。例如,对于动态分配的数组,您可以使用它std::vector<char>来代替它,new char[]它具有所有的灵活性,没有手动内存管理等缺点。