2017-09-18 170 views
-1

纵观到下面的代码片断:静态对象被破坏时动态内存被破坏了吗?

//A.h 
class A 
{ 
    void f(); 
}; 

//A.cpp 
#include "A.h" 

void A:f() 
{ 
    map<string, string> *ThisMap = new map<string, string>; 

    //more code (a delete will not appear) 
} 

//main.cpp 
#include "A.h" 

int main(int argc, char **argv) 
{ 
    A object; 

    object.f(); 

    //more code (a delete will not appear) 

    return 0; 
} 

当主()结束它执行,对象将被破坏。将被销毁dinamic分配的内存也签署到ThisMap?

+3

是'object'将被销毁并从内存中移除。 ***然而,***您在'A :: f'中分配的内存将不会被释放(通过您的程序),因此您将有内存泄漏。经验法则:'删除'你'新'','删除''''你'新[]''''。 –

+3

静态对象在哪里? – juanchopanza

+3

除此之外,动态分配标准容器通常是非常不寻常的,在大多数情况下它并不是必需的。如果出于某种原因,它*是*需要,然后使用例如['的std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)。 –

回答

2

会被破坏dinamic分配的内存也签署到ThisMap吗?

你有内存泄漏,因为object被破坏,其析构函数被调用,但没有delete被称为你的地图。

专业提示:delete无论你做什么new'ed,当你完成它。


PS:我很怀疑,你需要动态分配一个标准集装箱(如std::map),但如果你真的相信你需要使用,那么可以考虑使用std::unique_ptr

0

会被破坏dinamic分配的内存是否也符合ThisMap?

没有,拇指的前C++ 11的规则是,如果你new东西,你以后必须delete它。

自从C++ 11以来,我们强烈建议您使用智能指针,它以安全的方式为您处理分配/释放。 std::unique_ptr的文档是一个很好的起点。

+0

好的!谢谢!在这种情况下,我无法修改代码,我正在对它进行测试,并且CppUTest没有向我报告泄漏。我放了一个类似的代码片段,并且不使用std :: unique_ptr。 – fdmg

0


1.如果要ThisMap是A的数据字段,您必须声明,并实现自己的析构函数,所以你的代码应该是这样的:

class A 
{ 
    std::map<std::string, std::string> *ThisMap; 
    void f(); 
    ~A(); 
}; 

void A::f() 
{ 
    ThisMap = new map<std::string, std::string>; 

    //more code (a delete will not appear) 
} 
A::~A() 
{ 
    if(ThisMap) delete ThisMap; 
} 

2.如果ThisMap是只是一个函数变量,所以你只需要在使用结束时删除它,如:

void A::f() 
{ 
    map<string, string> *ThisMap = new map<std::string, std::string>; 
    //more code (a delete will not appear) 
    delete ThisMap; 
} 

公告称,其A::f而不是A:f
:)