Мы используем идиому 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 управляются.Есть идеи?