【发布时间】:2021-08-09 18:52:34
【问题描述】:
我正在阅读 C++ Primer Plus, 12.1.3,关于内存,而关于析构函数的一些东西真的让我很困惑。
//Here is a default construtor of String class
String::String()
{
len = 0;
str = new char[1];
str[0] = '\0';
}
书上说,使用str = new char[1] 而不是str = new char,这两种方式分配相同的内存,但第二种方式与析构函数不兼容。此外,书中说以下三种方式不好,因为它们与“删除”不兼容
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
我不知道这三种方式有什么区别,有人可以向我解释一下吗?非常感谢。
【问题讨论】:
-
你
delete[]你new[]。你没有delete[]你没有new[]。这里没有太多要解释的。 -
你只能
delete你new你必须delete[]你new[]。也停止使用new和delete;而是使用std::vector和/或std::make_unique -
如果嘘,建议你使用
new/delete,那么最好的地方是在后院。如果那是你有垃圾箱的地方。 -
@Enlico 理解内存分配语义仍有一定的好处。即使很少用于更高级别的现代应用程序。
-
@DanielLangr 当然,但我会走得更远。 (非常)经常,人们陷入迭代器失效,因为他们不明白
std::vector在达到最大容量时必须重新分配内存(仅仅是因为他们甚至不明白什么是内存分配)。我坚信了解任何事物背后的机制比仅仅忽略它要好得多(更糟糕的是,将始终忽略它作为经验法则是在某些时候做愚蠢事情的最佳方法)。
标签: c++ class pointers destructor