Я не могу понять, почему следующий код производит утечки памяти (я использую boost::shared_ptr
со статическим экземпляром класса). Кто-то мог помочь мне?
#include <crtdbg.h>
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
#define _CRTDBG_MAP_ALLOC
#define NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
static struct myclass {
static shared_ptr<int> ptr;
myclass() {
ptr = shared_ptr<int>(NEW int);
}
} myclass_instance;
shared_ptr<int> myclass::ptr;
int main() {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF |
_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
return 0;
}
Предположительно, CRT сообщает о ложном срабатывании - следующий код показывает, что общий указатель работает правильно, по крайней мере, с g ++
#include <iostream>
#include "boost/shared_ptr.hpp"
using namespace std;
using namespace boost;
struct R {
R() {
cerr << "ctor" << endl;
}
~R() {
cerr << "dtor" << endl;
}
};
struct A {
static shared_ptr<R> ptr;
A() {
ptr = shared_ptr<R>(new R);
}
};
shared_ptr<R> A::ptr;
static A a;
int main() {
}
Он печатает:
ctor
dtor
Скорее всего, утечка обнаружена до того, как глобальные объекты будут уничтожены, и shared_ptr
имеет шанс освободить объект, поэтому, скорее всего, это ложная утечка.