关于这个问题:
m_sFilename = new char [len+1];
我应该在什么时候调用delete[] m_sFilename;
?
还有:
我应该使用delete[] m_sFilename
还是 delete m_sFilename;
?
关于这个问题:
m_sFilename = new char [len+1];
我应该在什么时候调用delete[] m_sFilename;
?
还有:
我应该使用delete[] m_sFilename
还是 delete m_sFilename;
?
"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
后面吗? - Jaywalkerchar
。而且,更进一步地说,甚至可以说在深入了解数组和动态分配等细节之前应该先学习std::vector
和std::string
。不幸的是,由于历史原因,C++几乎从未以这种方式教授。 - Lightness Races in Orbitstd::string
的等效物,才能使用new[]
和delete[]
。它们本身是不安全的。 - Mankarsenew[]
和delete[]
都是语言中重要的一部分。你不能永远向学生隐藏它:/ - riwalk是的,如果你不想让new[]
分配的内存泄漏,那么在使用完该内存后应该delete[]
它。
为了避免跟踪这些内存,我建议您使用std::string
或std::vector
代替。
3.8/4
,"[...] 然而,如果没有显式调用析构函数或者没有使用delete-expression(5.3.5)释放存储空间,则析构函数不应该被隐式调用,并且任何依赖于析构函数产生的副作用的程序都具有未定义行为。",那么我认为这并不适用。 - Lightness Races in Orbitstd::string
来存储m_sFilename
会更好 - 在几乎所有方面都更好。对于本地数据类型和没有析构函数的用户定义数据类型,使用delete
或delete[]
都意味着相同的操作。底层堆管理器将释放所有内存。但是,在向量new[]
上调用标量delete
不会使所有析构函数被调用。析构函数仅在第一个对象上调用一次。
上述行为取决于编译器/堆管理器(处理new
和delete
)的依赖性。为了更好的可移植性,对于标量new
使用标量delete
,对于向量new
使用向量delete[]
。