C ++:我什么时候需要考虑可能的内存泄漏?

时间:2010-11-03 22:32:49

标签: c++ memory-leaks

我可以使用自己的代码在C ++中意外地产生内存泄漏而不使用newmalloc函数吗? (以及分配内存的所有其他stdlib函数)

6 个答案:

答案 0 :(得分:8)

如果你没有在堆上分配任何东西,那么一般来说你不必担心内存泄漏。

如果你没有调用在堆上分配东西的函数,那么你的所有数据都会保存在堆栈中,并在弹出时被销毁。

答案 1 :(得分:3)

您不应在C ++中使用malloc

每当您尝试手动管理动态(使用new分配)内存时,无论是自己分配内存还是调用某些函数,都需要担心内存管理问题。 (函数的文档应告诉您是否需要释放它返回的内容以及需要使用的方法。)

更重要的是,您需要担心您获得的 每个资源 ,无论是内存,打开文件,锁定的互斥锁还是其他什么。当您使用RAII等技术时,需要担心。

许多资源(字符串,数组和其他容器,文件等)已经包含在RAII类中。使用它们并担心您的算法,而不是资源管理细节。

答案 2 :(得分:1)

    CRT中的
  • _strdup创建一个应使用free删除的缓冲区。
  • 有一些Windows SDK函数可以创建您应该删除的缓冲区。 FormatMessage可能会创建一个应使用LocalFree删除的缓冲区。
  • 如果你抓住structured exceptions并阻止堆栈展开,那么内存可能会泄漏。
  • 如果您启动一个线程并且在主线程完成之前没有让它正常完成,那么就会出现内存泄漏(在应用程序生命周期结束时,但它仍然是泄漏)。

答案 3 :(得分:0)

堆上的内存只能使用此类函数/运算符(或其他非函数)进行分配。

当然,如果您使用的是某些非标准函数,它可以在堆中分配内存。如果他们没有被窃听,他们应该注意删除他们的东西,或者在文档中明确声明函数调用者将获得所分配数据的所有权。

答案 4 :(得分:0)

没有分配堆内存(这是malloc和new所做的)很难,但并非不可能。假设你正在开发一款游戏。

void playGame()
{
    ...
    showResults();
}

void showResults()
{
    ...
    if (playAgain)
        playGame();
    else
        exit(0);
}

在此示例中,只要用户继续选择再次播放,堆栈就会不断增长。如果用户选择再次播放,则调用playGame函数,但由于showResults尚未返回,原始的playGame也没有返回,因此在那里创建的所有堆栈变量仍然存在。新的playGame实例创建了这些变量的新副本。如果玩家一次又一次地玩,你可能会耗尽堆栈空间。从技术上讲,这可能不会被称为内存泄漏,但它类似。你完成使用的记忆没有被释放。

答案 5 :(得分:0)

没有。如果你没有分配内存,你就不能泄密。

通常情况下,如果您需要使用' new'或者' malloc',RAII建议类明确拥有内存并在析构函数中清理它。

class blah {
  public:
    blah(): thing(null) { thing = new thing(); }
    ~blah() { delete thing; }
  private:
    thing *thing;
};

如果您确实需要动态内存分配(未明确拥有),请使用unique_ptr。

void func() {
  std::unique_ptr<W> because(new thing);
  because->because();
}