为什么“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[]它具有所有的灵活性,没有手动内存管理等缺点。


以上是为什么“new”的不同使用方式会导致结果与“delete”不兼容?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>