“新”会导致功能中的内存泄漏吗?

时间:2013-07-28 18:52:21

标签: c++ memory memory-management memory-leaks

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

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

5 个答案:

答案 0 :(得分:5)

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

话虽如此,您应该避免在代码中直接调用newdelete,并且更喜欢使用 safe 的其他构造(自动处理内存)您)。在您提到的特定情况下,使用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[](如果没有移动到另一个智能指针)。

答案 1 :(得分:3)

调用者需要知道您返回了使用new []创建的内容,并在必要时调用delete []。在这样的构造中存在很多错误的余地。最好回报一些照顾自己记忆的东西,例如std::vectorstd::unique_ptr

答案 2 :(得分:0)

当使用数组完成程序时,应该执行

删除操作。它不必具有相同的功能。

如果函数结束时总是需要delete,那么它会自动添加(unique_ptr是一种告诉C ++ 11自动释放new的方法。功能结束)

答案 3 :(得分:0)

它们是从堆中分配的。所以你可以而且应该在函数之外的任何地方删除。

New和Delete不使用堆栈。同样适用于malloc和free。

答案 4 :(得分:0)

完成后,您可以在新范围内delete [] p。但是,仅使用new分配内存并将所有权分配给另一个范围不是一个好习惯。您可以使用std::vectorsmart pointers