如果我没有使用新关键字,我可以有内存泄漏吗?

Mon*_*der 10 c++ memory-leaks

我是这门语言的新手,我对内存泄漏有一个基本的疑问.如果我不使用new关键字,是否可能发生泄漏?(即在堆栈中使用我的变量并使用数据容器std::vector)

我应该担心这个问题吗?

如果是这种情况,有人可以给我一个例子,说明在没有动态分配内存的情况下造成泄漏吗?

πάν*_*ῥεῖ 7

即在堆栈中使用我的变量并使用数据容器 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)

由于共享指针的引用计数器永远不会降为零,因此这些实例永远不会被删除并导致内存泄漏.

有关原因以及如何避免它的更多信息可以在这里找到


J. *_*eja 4

我认为如果不动态保留内存就不可能泄漏内存。也许全局变量不会被释放,但我不会称其为内存泄漏。

但是,除了使用关键字之外,还有更多动态保留内存的方法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()。不完全是内存泄漏,但它是分配的资源,直到结束才自动释放。

  • 拥有静态向量并没有什么问题。这不是一个特别好的答案。 (3认同)