std :: list内存泄漏与接口

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个内存泄漏仍然存在.

由于我没有使用任何新的(甚至不添加我添加的元素),我猜测列表本身会创建一些变量并且不删除它们,我该如何解决这个问题呢?

K-b*_*llo 5

_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)