代码之家  ›  专栏  ›  技术社区  ›  sud03r

防止内存泄漏(具体情况)

  •  3
  • sud03r  · 技术社区  · 14 年前

    考虑以下情况:

    SomeType *sptr = someFunction();
    // do sth with sptr
    

    我不知道someFunction()的内部。很明显,指向someFunction()返回的对象的指针必须是malloc'ed或是静态变量。

    现在,我对SPTR做了些什么,然后退出。显然,对象仍在堆中,这可能是泄漏源。

    我该怎么避免呢?

    编辑:

    引用是否比指针更安全? 如果我这样做,是否会调用某个类型的析构函数:

    {
      SomeType &sref = *sptr;
    }
    

    任何见解。

    6 回复  |  直到 14 年前
        1
  •  19
  •   R Samuel Klatchko    14 年前

    您需要阅读文档 someFunction . 某种功能 需要明确定义返回指针的所有权(调用方是否拥有它并需要调用 delete 或做 某种功能 拥有它并确保对象在将来某个时候被销毁)。

    如果代码没有记录它的行为,那么就没有安全的方法来使用它。

        2
  •  3
  •   Uri    14 年前

    你说辞职是什么意思?结束进程?当进程被破坏时,您的堆通常会被破坏。如果您要求操作系统为您做一些事情(如获取文件或窗口句柄),但没有释放它,那么在退出进程后,您将只会获得泄漏的可能性。

    此外,返回指针的函数需要很好地记录解除指针目标分配的责任(如果有的话),否则,您不知道是否需要自己删除它,或者您可以意外地删除它(如果您不打算这样做,那将是一场灾难)。

    如果函数的文档没有告诉您要做什么,请检查库文档-有时整个库采用相同的策略,而不是在每个函数中记录它。如果你在任何地方都找不到答案,联系作者或者放弃图书馆,因为潜在的错误是不值得的,imho。

    根据我的经验,大多数返回指针的函数要么动态分配指针,要么返回基于输入参数的指针。在这种情况下,由于没有参数,我敢打赌它是动态分配的,完成后您应该删除它。但是编程不应该是一个猜测游戏。

        3
  •  0
  •   Max    14 年前

    你自己清理总是一个好习惯,不要以为操作系统会这样做;

    当您退出应用程序时,您的IDE或调试器将报告内存泄漏,这是一个很好的更改。

    你要做什么?当然,这取决于,但是通常情况下,您必须释放someFunction()分配的内存,并且文档可能会帮助您实现这一点,要么有一个API来释放内存,要么您必须使用free或delete手动释放内存。

    马克斯

        4
  •  0
  •   neal aise    14 年前

    图书馆应该把这个记录下来。 要么在使用后显式删除它,要么调用一些发布方法,以确保对象(以及它指向*的任何其他资源)不会泄漏。

    (给出一个选择)除非它是一个巨大的(在内存方面)对象,否则我更喜欢按值返回。或者传递对函数的引用。

        5
  •  0
  •   INS    14 年前

    如果 someFunction 为我返回一个对象。它应该是正常的,有一对函数 someFunctionFree 您将调用它来释放 SomeType 对象。所有需要的东西都应该在 某种功能 (主要) 怎样 对象可以被释放,或者如果对象被自动释放)。我个人更喜欢相应的释放函数(CreateObject/DestroyObject对)。

        6
  •  0
  •   Robert S. Barnes Antoni    14 年前

    正如其他人注意到的,这取决于在代码中强制执行其所有权假设的功能。有一种方法可以做到这一点 smart pointers :

    #include <iostream>
    #include <boost/shared_ptr.hpp>
    
    struct Foo
    { 
      Foo( int _x ) : x(_x) {}
      ~Foo() { std::cout << "Destructing a Foo with x=" << std::hex << x << "\n"; }
      int x;
    };
    
    typedef boost::shared_ptr<Foo> FooHandle;
    
    FooHandle makeFoo(int _x = 0xDEADBEEF) {
        return FooHandle(new Foo(_x));
    }
    
    int main()
    {
        {
            FooHandle fh = makeFoo();
        }
        std::cout<<"No memory leaks here!\n";
    
        return 0;
    }