c++ - std::list 接口(interface)内存泄漏

标签 c++ memory-leaks interface virtual abstract-class

我遇到了 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;
}

仅声明了 PackOfObjs,我就已经有 2 次内存泄漏,如果我删除 std::list,它们就会消失,并且对于我添加到列表中的每个地址,它们都会增加 1。 我尝试清除列表和一些清除之前指向的所有 objs 的代码,但至少 2 个内存泄漏仍然存在。

因为我没有使用任何new(甚至没有在我添加的元素上),我猜测列表本身创建了一些变量并且没有删除它们,我该如何解决这个问题?

最佳答案

_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;
}

我似乎记得调用_CrtDumpMemoryLeaks 的推荐方式是在全局对象的析构函数中。对于其他全局对象来说,这可能还为时过早,但至少在 main 中创建的所有对象都已经被销毁了。

struct memory_leak_dumper
{
    ~memory_leak_dumper(){ _CrtDumpMemoryLeaks(); }
};
memory_leak_dumper _dumper; // this is a global object

关于c++ - std::list 接口(interface)内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077248/

相关文章:

c++ - 在 basic_string 中查找 STL::Exception 的来源

c++ - 如何在vscode中构建、运行和删除可执行文件和虚拟文件

c++ - 内存泄漏和 delete[] 崩溃

c++ - 减去两个字符并将它们添加到字符串

javascript - 避免 XMLHttpRequest 链调用泄漏

javascript - 清理内存泄漏

vb.net - 存储实现多个接口(interface)并派生自某个基础(.net)的对象

java - 为具有不同参数的方法设计接口(interface)

javascript - redux store state 的导出接口(interface)

c++ - 有没有办法为 C 或 C++ 结构强制执行特定的字节顺序?