我是这门语言的新手,我对内存泄漏有一个基本的疑问.如果我不使用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;
};
Run Code Online (Sandbox Code Playgroud)
由于共享指针的引用计数器永远不会降为零,因此这些实例永远不会被删除并导致内存泄漏.
有关原因以及如何避免它的更多信息可以在这里找到
我认为如果不动态保留内存就不可能泄漏内存。也许全局变量不会被释放,但我不会称其为内存泄漏。
但是,除了使用关键字之外,还有更多动态保留内存的方法new。
例如,malloc分配一个内存块。还calloc保留内存并将其归零。
您的操作还可以为您提供管理内存的方法。例如strdup对于 Linux。
您还可以使用智能指针并调用std::make_unique或std::make_shared。两种方法都动态分配内存。
因为std::unique_ptr如果您调用release()并忘记删除指针,则可能会泄漏。
std::make_unique<int>(3).release(); // Memory leak
Run Code Online (Sandbox Code Playgroud)
因为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;
}
Run Code Online (Sandbox Code Playgroud)
std::vector::clear()不需要释放向量分配的内存。因此,调用后f(),您将分配 400 MB 内存,但只能在内部访问f()。不完全是内存泄漏,但它是分配的资源,直到结束才自动释放。
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |