簡體   English   中英

神秘的內存泄漏

[英]Mysterious memory leakage

我在Internet上有寫得並不完美的代碼,但是在我看來,沒有內存泄漏。 但是,請確保我使用的valgrind持不同意見。

這是代碼:

class BaseClass {
public:
    virtual ~BaseClass() {}
};

class DerivedClass1 : public BaseClass {
};

class DerivedClass2 : public BaseClass {
};

class UserClass {
private:
    BaseClass* base_;
public:
    void setDerived(BaseClass* p_base) {
        delete base_;
        base_ = p_base;
    }

    UserClass (BaseClass *p_base){
        base_ = p_base;
    }

    ~UserClass() {
       delete base_;
    }
};

int main() {
    UserClass * my_class = new UserClass(new DerivedClass1);
    my_class->setDerived(new DerivedClass2);
    return 0;
}

這是valgrind所說的:

==10125== HEAP SUMMARY:
==10125==     in use at exit: 16 bytes in 2 blocks
==10125==   total heap usage: 3 allocs, 1 frees, 24 bytes allocated
==10125== 
==10125== Searching for pointers to 2 not-freed blocks
==10125== Checked 179,544 bytes
==10125== 
==10125== 8 bytes in 1 blocks are indirectly lost in loss record 1 of 2
==10125==    at 0x4C28C90: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10125==    by 0x40074E: main (AbstractFactory.cpp:32)
==10125== 
==10125== 16 (8 direct, 8 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==10125==    at 0x4C28C90: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10125==    by 0x400732: main (AbstractFactory.cpp:31)
==10125== 
==10125== LEAK SUMMARY:
==10125==    definitely lost: 8 bytes in 1 blocks
==10125==    indirectly lost: 8 bytes in 1 blocks
==10125==      possibly lost: 0 bytes in 0 blocks
==10125==    still reachable: 0 bytes in 0 blocks
==10125==         suppressed: 0 bytes in 0 blocks
==10125== 
==10125== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 3 from 3)
--10125-- 
--10125-- used_suppression:      3 dl-hack3-cond-1 /usr/lib/valgrind/default.supp:1196
==10125== 
==10125== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 3 from 3)

對我來說,一切似乎都是正確的。 在第31行分配了內存,並在setDerived方法期間將其釋放。

感謝您的任何幫助。

您的代碼正在泄漏,是的。 這也不是個謎。

真的很簡單,您永遠不會調用my_class的析構my_class

添加delete my_class; return 0;之前的行上return 0; main

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM