"new"也会导致功能内存泄漏吗?
Will "new" cause memory leak in function as well?
>假设我们想在C++中声明一个函数,其中我声明了一个局部变量int p=new int [10];
,然后我做了一些操作,最后我return p;
.
正如人们常说的,如果我们使用 new
,我们必须delete
.但我认为在这种情况下,我们不应该删除,对吧?否则,它根本无法返回 p,对吧?但是,我也在考虑我们是否应该删除函数在 int main()
中测试时返回的项目。
规则是,对于每个new
都必须有一个delete
(对于每个new[]
,必须有一个delete[]
*(,但它不必在同一范围内。通常,函数动态创建一个对象并将该对象的所有权转移给调用方。然后,调用方将负责删除内存。
话虽如此,您应该避免在代码中直接调用new
和delete
,而更喜欢使用其他安全的构造(自动为您处理内存(。在您提到的特定情况下,用 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::vector
或std::unique_ptr
。
应该在使用数组的程序完成时完成。它不必在同一函数中。
如果函数结束时总是需要delete
完成,它会自动添加(unique_ptr
是一种告诉 C++11 在函数结束时自动释放某些内容的方法new
(
它们是从堆中分配的。因此,您可以并且应该在函数之外的任何地方删除。
新建和删除不使用堆栈。同样适用于马洛克和免费。
您可以在新作用域中delete []
p
完成操作后返回它。但是,仅分配具有new
的内存并将所有权分配给另一个作用域并不是一个好的做法。您可以使用std::vector
或智能指针。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏