утечка памяти структуры pimpl - PullRequest
1 голос
/ 17 марта 2011

Мы используем идиому pimpl в наших классах.Структура pimpl объявлена ​​в классе, который содержит указатель pimpl следующим образом:

struct MyClassImpl;
friend struct MyClassImpl;
boost::scoped_ptr<MyClassImpl> m_Impl;

Реализация для pimpl находится в отдельном файле с именем MyClassImpl.cpp Например:

    struct MyClass::MyClassImpl
        {
            QString m_Name;                             
            int m_Type;                                 
            double m_Frequency;                         
            int m_DefaultSize;                          
            QVariant m_DefaultValue;
                 boost::shared_ptr<SomeOtherClass> m_SomeOtherClass;                    

            ~MyClassImpl()
            {
            }
        };

В конструкторе класса, который содержит указатель pimpl, я бы имел в списке инициализации переменных-членов что-то вроде

m_Impl(new MyClassImpl())

Теперь мы включили обнаружение утечки памяти в нашем исходном коде, например, так:

// Memory leaks detection in Visual Studio
#if defined (_WIN32) && defined (_DEBUG)
#   define _CRTDBG_MAP_ALLOC
#   include <crtdbg.h>
#   define new new(_NORMAL_BLOCK ,__FILE__, __LINE__) 
#endif

Я обнаружил, что при выходе из программы сообщается об утечках памяти для структуры MyClassImpl () m_Impl (new MyClassImpl ()):

..\..\src\MyClass.cpp(29) : {290222} normal block at 0x0B9664E0, 48 bytes long.
 Data: <X l V         Y@> 58 1C 6C 03 56 00 00 00 00 00 00 00 00 00 59 40 

Я не понимаю, почему, посколькуm_Impl - это boost :: scoped_ptr, а все QString, QVariant и shared_ptr управляются.Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Похоже, это должно работать ..

Что я нахожу странным, так это размер утечки, всего 48 байт.

Я бы сделал вывод, что структура MyClassImpl освобождена, но что-то в ней нет. В случае утечки всей структуры утечка будет намного больше, чем 48 байтов.

Но, тем не менее, я не могу найти ошибку в этом коде.

Получите Visual Leak Detector для улучшения отладки, это бесплатно.

http://vld.codeplex.com/

1 голос
/ 17 марта 2011

Возможно, экземпляры MyClass освобождаются без должного удаления? Если, например, они размещаются где-то с помощью размещения новых, то они не будут сообщаться как индивидуальные утечки, но и не будут автоматически уничтожаться при освобождении их памяти.

...