“new char[]”需要手动释放资源吗?

4

关于这个问题:

m_sFilename = new char [len+1];

我应该在什么时候调用delete[] m_sFilename;

还有:

我应该使用delete[] m_sFilename 还是 delete m_sFilename;


从精确意义上讲,不需要;但如果可以的话,最好这样做;否则可能会导致从完全无害的行为到导致崩溃的内存泄漏等一系列问题。 - Patrick87
1
你用的是什么糟糕的C++语言书?换一本吧。 - Hans Passant
有时候?为什么你会在某些时候调用某个函数而在其他时候不调用呢? - Jaywalker
@Jaywalker:他所说的“sometime”意思是“在某个时间点”。 - Lightness Races in Orbit
4个回答

7

"new char[]"需要手动释放资源吗?

是的。

对于这个:m_sFilename = new char [len+1]; 我需要在某个时候调用delete[] m_sFilename;吗?

是的。

我应该使用delete[] m_sFilename还是delete m_sFilename;

delete[]


但你应该实际上使用std::string,它会为你做所有这些事情,并且是免费的。


虽然使用std::string的建议是正确的,但我认为它被放错了位置。难道不应该先实际学习使用new[]delete[],而不是躲在std::string后面吗? - Jaywalker
1
@Jaywalker:不使用char。而且,更进一步地说,甚至可以说在深入了解数组和动态分配等细节之前应该先学习std::vectorstd::string。不幸的是,由于历史原因,C++几乎从未以这种方式教授。 - Lightness Races in Orbit
1
@Jaywalker - 你需要做的第一件事情是重写std::string的等效物,才能使用new[]delete[]。它们本身是不安全的。 - Mankarse
1
我认识一些在学习char[]之前就已经学过std::string的学生,我觉得他们更倾向于依赖标准库(我赞成这种做法),并且有更有趣的作业任务。 - Mooing Duck
我同意教授STL的好处,但无论它们有多危险,new[]delete[]都是语言中重要的一部分。你不能永远向学生隐藏它:/ - riwalk
@Stargazer712:没有人说你应该这样做。 - Lightness Races in Orbit

4

是的,如果你不想让new[]分配的内存泄漏,那么在使用完该内存后应该delete[]它。

为了避免跟踪这些内存,我建议您使用std::stringstd::vector代替。


在编程中,“挑剔”不调用使用“new[]”分配的指针的“delete[]”技术上会导致未定义行为,在这种情况下很可能会导致内存泄漏 - Alok Save
@Als:哪里说了这是未定义行为?如果你想到的是n3290 3.8/4,"[...] 然而,如果没有显式调用析构函数或者没有使用delete-expression(5.3.5)释放存储空间,则析构函数不应该被隐式调用,并且任何依赖于析构函数产生的副作用的程序都具有未定义行为。",那么我认为这并不适用。 - Lightness Races in Orbit

2
是的,但是使用std::string来存储m_sFilename会更好 - 在几乎所有方面都更好。

0

对于本地数据类型和没有析构函数的用户定义数据类型,使用deletedelete[]都意味着相同的操作。底层堆管理器将释放所有内存。但是,在向量new[]上调用标量delete不会使所有析构函数被调用。析构函数仅在第一个对象上调用一次。

上述行为取决于编译器/堆管理器(处理newdelete)的依赖性。为了更好的可移植性,对于标量new使用标量delete,对于向量new使用向量delete[]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接