泄漏记忆的方式不同

ash*_*ony 15 c++ memory-leaks

内存泄漏的基本概念是代码执行期间新/删除操作的不匹配,可能是由于错误的编码实践,也可能是在跳过删除操作时出现错误的情况.

但最近我在一次采访中被问到一个问题,关于内存泄漏的其他方式.我没有答案.它是什么?

Alo*_*ave 16

常见的动态内存问题是:

  • 使用new而不是取消分配的动态内存分配delete.
  • 使用new[]和取消分配动态内存分配delete.
  • 动态内存分配new并将其解除分配free.
  • 动态内存分配malloc并将其解除分配delete.

除了内存泄漏/内存损坏之外,最后3个场景将导致可怕的未定义行为.

我可以回忆一些其他潜在的内存泄漏导致的情况是:

  • 如果指向动态分配的内存区域的指针在被释放之前重新分配了一个新值,则会导致悬空指针和内存泄漏.

一个代码示例:

char *a = new[128];
    char *b = new[128];
    b = a;
    delete[]a;
    delete[]b; // will not deallocate the pointer to the original allocated memory.
Run Code Online (Sandbox Code Playgroud)

- STL容器中的指针

更常见且经常遇到的情况是,存储指向STL容器中动态分配类型的指针.重要的是要注意,只有当 STL容器不是指针类型时,它才拥有删除包含对象的所有权.
在删除容器本身之前,必须显式迭代容器并删除每个包含的类型.不这样做会导致内存泄漏.
以下是此类方案的示例.

- 非虚拟基类析构函数问题

删除指向Base类的指针,该指针指向堆上派生类的任何动态分配对象.这会导致未定义的行为.

一个代码示例:

class MyClass
{
    public:
    virtual void doSomething(){}
}; 
class MyClass2 : public MyClass 
{ 
    private:  
        std::string str;  
    public: MyClass2( std::string& s) 
    {  
        str=s; 
    }  
    virtual void doSomething(){}
};  

int main()
{  
     std::str hello("hello"); 
     MyClass * p = new MyClass2(hello);  
     if( p ) 
     { 
        delete p;  
     } 
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

在示例中,仅调用析构函数MyClass ::〜MyClass(),并且永远不会调用MyClass2 :: ~MyClass2().为了适当的释放,人们需要,

MyClass::virtual ~MyClass(){}
Run Code Online (Sandbox Code Playgroud)

-调用delete上的void指针

一个代码示例:

void doSomething( void * p ) 
{
    //do something interesting
    if(p)
       delete p; 
}

int main()
{
    A* p = new A();
    doSomething(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

呼叫delete上的void指针如在上面的例子中,会引起了内存泄漏和未定义的行为.

  • @iammilind:好的一切归结为同一点,唯一的一点,其余的都是场景. (3认同)
  • 不要忘记只保留周围的物体永远不会再使用.这是经典的"缓存"内存泄漏,其中对象的缓存永远增长.这是一个垃圾收集也无法帮助的人. (3认同)

归档时间:

查看次数:

3122 次

最近记录:

14 年,10 月 前