如果不使用delete,函数结束时内存会被释放吗?

3

假设你有一个函数:

void foo()
{
  char* pt = new char[10];
  //do stuff with pt
}

指针是在本地创建的,函数终止后内存会被释放吗?还是你真的需要使用delete[]来释放内存?


指针是在本地创建的,而不是它所指向的东西。 - JBentley
5个回答

8

new/new[]分配的内存具有动态存储期。它们只有在用户显式调用delete/delete[]后才会被释放。


非常感谢!这下事情清楚多了。 - user1747719
所以,除非pt被全局声明或作为类的一部分声明,否则它在函数终止后将无法访问,而内存仍将被分配,对吗? - user1747719
1
@user1747719 正确。您将失去对分配对象的任何访问权限。这就是内存泄漏。 - Joseph Mansfield
请注意,“智能指针”在它们被删除时会关心删除操作。在“自动存储期”中使用它们会触发这一点。 - leemes

2
如果您使用“new”或“new []”而没有使用智能指针类,内存将不会自动释放。您需要适当地调用“delete”或“delete []”来释放它。

哇,我不知道在C++中malloc()被替换了。 - rliu
2
@roliu 你是在哪里学习C++的? - Joseph Mansfield
@roliu malloc + free与new + delete是相辅相成的。它们彼此依存。永远不要删除malloc分配的内存,也永远不要释放new分配的内存。malloc从未被“替换”。 - leemes
2
是的,你可以仍然使用malloc(并使用free释放任何分配给它的内容),但通常你应该使用new和delete。使用malloc只意味着你正在编写C代码,并使用C++编译器进行编译。 - Colen
1
@leemes,operator new 更像是 malloc 的替代品。 - Joseph Mansfield
显示剩余2条评论

1

是的,你绝对需要使用delete[]。它可以在同一个函数中或其他地方(如果你选择返回pt)。

如果你使用容器,比如vector,那么你就不需要使用它。

std::vector< char > pt( 10 );

1
不行 - 这是一个内存泄漏。每个new都应该有相应的delete(每个new[]都应该有相应的delete[])。

1
好的建议,但有点老派。如果您使用智能指针,您将永远不会遇到“delete”,也不需要它。 - Mark Ransom
2
@MarkRansom:但是对于每个新建的对象,仍然有相应的删除操作,即使您没有在自己的代码中直接调用它。(我知道您知道这一点,但对于阅读您评论的其他人来说) - Benjamin Lindley
1
@MarkRansom - 同意!然而,在我们的项目中,我们已经使用智能指针很长时间了,但仍然会遇到需要处理原始指针的情况(例如,与COTS库一起工作等)。人们仍然需要学习C++中的new/delete(尽可能使用和理解智能指针)。 - Tom

0

你真的需要使用delete[]


1
最好使用实际的字符串对象,而不是动态分配char数组。 - dan04
这只是一个例子。 - user1747719

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