"new"也会导致功能内存泄漏吗?

Will "new" cause memory leak in function as well?

本文关键字:内存 泄漏 功能 new      更新时间:2023-10-16

>假设我们想在C++中声明一个函数,其中我声明了一个局部变量int p=new int [10];,然后我做了一些操作,最后我return p; .

正如人们常说的,如果我们使用 new ,我们必须delete .但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回 p,对吧?但是,我也在考虑我们是否应该删除函数在 int main() 中测试时返回的项目。

规则是,对于每个new都必须有一个delete(对于每个new[],必须有一个delete[]*(,但它不必在同一范围内。通常,函数动态创建一个对象并将该对象的所有权转移给调用方。然后,调用方将负责删除内存。

话虽如此,您应该避免在代码中直接调用newdelete,而更喜欢使用其他安全的构造(自动为您处理内存(。在您提到的特定情况下,用 10 个元素初始化的std::vector<int>在指针上的开销很小,并且将确保每当对象被销毁时释放内存。

* 根据您的实现,如果将内存交给智能指针,则可能会出现new(或new[](而不删除的情况。例如,在 C++11 中,您可以执行以下操作:

std::unique_ptr<int[]> f() {
    std::unique_ptr<int[]> p(new int[10]); // new is unmatched
    // ...
    return p;
}

这很好,因为处理指向std::unique_ptr的指针可确保它在超出范围时(如果未移动到其他智能指针(时在内部调用delete[]

调用方需要知道你返回了用 new [] 创建的内容,并在必要时调用delete []。在这样的结构中有很大的错误空间。最好返回一些照顾自己记忆的东西,例如std::vectorstd::unique_ptr

删除

应该在使用数组的程序完成时完成。它不必在同一函数中。

如果函数结束时总是需要delete完成,它会自动添加(unique_ptr是一种告诉 C++11 在函数结束时自动释放某些内容的方法new(

它们是从堆中分配的。因此,您可以并且应该在函数之外的任何地方删除。

新建和删除不使用堆栈。同样适用于马洛克和免费。

您可以在新作用域中delete [] p完成操作后返回它。但是,仅分配具有new的内存并将所有权分配给另一个作用域并不是一个好的做法。您可以使用std::vector或智能指针。