Dan*_*cco 2 c++ virtual abstract-class memory-leaks interface
我遇到std :: list和内存泄漏问题:
class AbstractObject
{
public:
virtual void Say() = 0;
}
class RealObject : public AbstractObject
{
public:
virtual void Say() { cout << "Real Obj Says..." << endl; } //Do I need the "virtual" keyword here too?
}
class AnotherRealObject : public AbstractObject
{
public:
virtual void Say() { cout << "Another Real Obj Says..." << endl; } //Do I need the "virtual" keyword here too?
}
class PackOfObjects
{
public:
std::list<AbstractObject*> objects; //list of pointers because it doesn't let me create a list of an abstract class
void Say()
{
for(std::list<AbstractObject*>::iterator obj = objects.begin(); obj != objects.end(); obj++)
{
(*obj)->Say();
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
PackOfObjs myObjs;
RealObject objA;
myObjs.objects.push_back(&objA); //This adds 1 memory leak
AnotherRealObject objB;
myObjs.objects.push_back(&objB); //This adds another 1 memory leak
_gettch();
_CrtDumpMemoryLeaks();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只有PackOfObjs声明我已经有2个内存泄漏,如果我删除了std :: list它们会消失,并且对于我添加到列表中的每个地址它们会增加1.我尝试清除列表和一些代码,删除清除之前指向的所有objs,但至少有2个内存泄漏仍然存在.
由于我没有使用任何新的(甚至不添加我添加的元素),我猜测列表本身会创建一些变量并且不删除它们,我该如何解决这个问题呢?
当_CrtDumpMemoryLeaks()运行时,内部分配的所有对象main仍然存在.你打电话_CrtDumpMemoryLeaks()太早了.相反,试试这个:
int _tmain(int argc, _TCHAR* argv[])
{
{
PackOfObjs myObjs;
RealObject objA;
myObjs.objects.push_back(&objA); //This adds 1 memory leak
AnotherRealObject objB;
myObjs.objects.push_back(&objB); //This adds another 1 memory leak
// <- all memory used by the list is freed here
}
_gettch();
_CrtDumpMemoryLeaks();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我似乎记得推荐的调用方式_CrtDumpMemoryLeaks是在全局对象的析构函数中.对于其他全局对象来说,这可能还为时过早,但至少在内部创建的所有对象main都已经被破坏了.
struct memory_leak_dumper
{
~memory_leak_dumper(){ _CrtDumpMemoryLeaks(); }
};
memory_leak_dumper _dumper; // this is a global object
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
433 次 |
| 最近记录: |