【问题标题】:C++ CRT Memory LeakC++ CRT 内存泄漏
【发布时间】:2012-04-30 14:02:42
【问题描述】:

我遇到了很多内存泄漏的问题。

CRT 在以下代码中显示泄漏,例如:

char *cmd = new char[128];

我该怎么办?

char *cmd = new char[128];
delete[] cmd;

我使用上面的代码使用 VLD(Visual Leak Debugger)启动了新项目,但它仍然说我正在泄漏。

【问题讨论】:

  • 当然我毕竟删除了这个参考
  • 这是哪个编译器?显示更多代码,也许这是在一个循环中,并不是所有的都被清理了
  • 你使用的是微软的_CrtDumpMemoryLeaks()吗?以我的经验,这对 C++ new/delete 调用并不好。因此,实际上您可能根本没有泄漏(但同样可能);)
  • 用std::string怎么样?
  • @Griwes:“还有,你到底为什么要使用”因为他在 C++ 中没有黑带,也不知道 std::vector,呵呵。

标签: c++ memory-leaks


【解决方案1】:

基本上,您需要在停止使用内存后立即释放它。

RAII 和 smart pointers 是一些很好的 C++ 自动化技术。

还可以考虑memory leaks 上的维基百科文章。

【讨论】:

  • @Hakon89 问题是内存没有回收到系统。您应该通过delete 运算符返回您不再使用的资源,否则您的程序和操作系统会感觉很糟糕。
【解决方案2】:

您应该调用delete[] arrayVariable; 而不是delete arrayVariable; 以避免与数组有关的内存泄漏。

【讨论】:

  • 是的,我删除 [] 而不是删除
【解决方案3】:

可能是您的对象在泄漏检测运行后被删除。

例如,如果您有静态对象,则必须注意删除顺序,以便在泄漏检测发生之前删除它们。

尝试将new/delete嵌入到一个函数中,看看是否仍然报告泄漏:如果没有,那么问题可能确实与执行泄漏检测后被删除的对象有关。

【讨论】:

    【解决方案4】:

    使用:

    std::vector<char> cmd(128);
    

    当您需要访问 char* 缓冲区时,您可以这样做:

    char* memory = &amp;char[0] 因为内存保证为 std::vector 继续。 无需删除,因为内存归对象所有。这使您的代码也异常安全,例如,如果在执行 delete [] 之前抛出异常,您将不会泄漏内存 []

    如果你想在堆栈上分配,你也可以使用 C++11 中的新 std::array

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2010-11-11
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多