我对这门语言还很陌生,关于内存泄漏我有一个基本问题。
如果我没有使用new
关键字(例如将变量存储在堆栈中并使用数据容器如std::vector
),是否可能出现内存泄漏?
我应该担心这个问题吗?
如果是这种情况,是否有人可以举例说明一种不需要动态分配内存却会导致泄漏的情况?
我对这门语言还很陌生,关于内存泄漏我有一个基本问题。
如果我没有使用new
关键字(例如将变量存储在堆栈中并使用数据容器如std::vector
),是否可能出现内存泄漏?
我应该担心这个问题吗?
如果是这种情况,是否有人可以举例说明一种不需要动态分配内存却会导致泄漏的情况?
即将我的变量放在堆栈中,并使用数据容器如
std::vector
不,使用std::vector
或其他标准容器就不需要担心这个问题。
有人能给我举一个不涉及动态分配内存的内存泄漏情况的例子吗?
一种常见的错误是循环依赖的智能指针,形式如下:
class Child;
class Parent {
std::vector<std::shared_ptr<Child>> childs;
};
class Child {
std::shared_ptr<Parent> parent;
};
由于共享指针的引用计数永远不会降至零,这些实例永远不会被删除,从而导致内存泄漏。
有关导致此问题以及如何避免它的更多信息,请参见此处
除了其他答案外,内存泄漏的另一个容易出现的来源是外部库。很多库,特别是类似于C语言的库,有像create_*
和destroy_*
这样针对数据类型的函数。即使您从未显式调用new
,仍然很容易出现内存泄漏。
std::unique_ptr
。 - sudgymalloc
分配一个内存块。此外,calloc
分配一段内存并将其清零。strdup
。std::make_unique
或 std::make_shared
。两种方法都是动态分配内存。std::unique_ptr
,如果调用了 release()
并忘记删除指针,则可能会泄漏内存。 std::make_unique<int>(3).release(); // Memory leak
std::shared_ptr
,如果创建循环引用,可能会导致内存泄漏。您可以在这里找到更多信息。#include <iostream>
#include <string>
#include <vector>
void f()
{
static std::vector<int> v;
v.insert(v.begin(), 100*1024*1024, 0);
v.clear();
}
int main()
{
f();
return 0;
}
std::vector::clear()
不需要释放向量分配的内存。因此,在调用 f()
后,您将有400 MB的内存分配,但只能在 f()
内部访问。这不完全是内存泄漏,但它是一种资源分配,直到结束时才会自动释放。
malloc
,呵呵。 - Phil M