#include <iostream>
using namespace std;
class A
{
public:
~A()
{
cout << "A::~A()" << endl;
}
};
#define USE_DYNAMIC_ALLOC
class B: public A
{
public:
B()
{
#ifdef USE_DYNAMIC_ALLOC
ptr = new char[1 << 20];
#endif
}
~B()
{
#ifdef USE_DYNAMIC_ALLOC
delete[] ptr;
#endif
cout << "B::~B()" << endl;
}
#ifdef USE_DYNAMIC_ALLOC
char *ptr;
#else
char ptr[1 << 20];
#endif
};
int _tmain(int argc, _TCHAR* argv[])
{
for(int i = 0; i < 100000; ++i)
{
A *a = new B;
delete a;
}
return 0;
}
Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
[]
А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
Здравствуйте, Аноним, Вы писали:
А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
Это был вопрос или вы сами на него ответили? Потому что не вызывается деструктор B.
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, vvv104, Вы писали:
V>>Это был вопрос или вы сами на него ответили? Потому что не вызывается деструктор B.
A>Поэтому нет утечек памяти? Вы вопрос-то читали?
А, не так прочитал вопрос. Звиняйте Ну тогда резонный вопрос, как проверялось отсутствие утечек.
Re[2]: Почему этот код не вызывает утечку памяти?
От:
Аноним
Дата:
27.07.09 14:29
Оценка:
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
A>[]
А>>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
A>Как проверялось "отсутствие утечек"?
Скомпиль, запусти, открой диспетчер процессов и посмотри используемую память.
Здравствуйте, Аноним, Вы писали:
А>>>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
A>>Как проверялось "отсутствие утечек"?
А>Скомпиль, запусти, открой диспетчер процессов и посмотри используемую память.
(Сначала написал фигню про empty based class optimization — невнимательно посмотрел код)
AFAIK, многие реализации new размещают служебную информацию о том, сколько памяти было выделенно. Соответственно, delete пользуется этой информацией, и удаляет всю память, занимаемую B.
А>#else
А> char ptr[1 << 20];
А>#endif
А>int _tmain(int argc, _TCHAR* argv[])
А>{
А> for(int i = 0; i < 100000; ++i)
А> {
А> A *a = new B;
А> delete a;
А> }
А> return 0;
А>}
А>
А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
Потому что деструктор во втором случае ничего не делает, освобождает память оператор delete, а он как правило знает откуда взять размер выделенного блока. Но это все равно UB
Лики есть и еще какие.
Модифицированный код с отловом утечек:
#include <iostream>
#include <afxwin.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define USE_DYNAMIC_ALLOC
using namespace std;
class A
{
public:
~A()
{
cout << "A::~A()" << endl;
}
};
#define USE_DYNAMIC_ALLOC
class B: public A
{
public:
B()
{
#ifdef USE_DYNAMIC_ALLOC
ptr = new char[1 << 20];
#endif
}
~B()
{
#ifdef USE_DYNAMIC_ALLOC
delete[] ptr;
#endif
cout << "B::~B()" << endl;
}
#ifdef USE_DYNAMIC_ALLOC
char *ptr;
#else
char ptr[1 << 20];
#endif
};
int _tmain(int argc, _TCHAR* argv[])
{
for(int i = 0; i < 100; ++i)
{
A *a = new B;
delete a;
}
return 0;
}
Отладочный выхлоп:
Detected memory leaks!
Dumping objects ->
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {268} normal block at 0x07980040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {266} normal block at 0x07870040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {264} normal block at 0x07760040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {262} normal block at 0x07650040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {260} normal block at 0x07540040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {258} normal block at 0x07430040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {256} normal block at 0x07320040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {254} normal block at 0x07210040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {252} normal block at 0x07100040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {250} normal block at 0x06FF0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {248} normal block at 0x06EE0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {246} normal block at 0x06DD0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {244} normal block at 0x06CC0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {242} normal block at 0x06BB0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {240} normal block at 0x06AA0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {238} normal block at 0x06990040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {236} normal block at 0x06880040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {234} normal block at 0x06770040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {232} normal block at 0x06660040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {230} normal block at 0x06550040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {228} normal block at 0x06440040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {226} normal block at 0x06330040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {224} normal block at 0x06220040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {222} normal block at 0x06110040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {220} normal block at 0x06000040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {218} normal block at 0x05EF0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {216} normal block at 0x05DE0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {214} normal block at 0x05CD0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {212} normal block at 0x05BC0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {210} normal block at 0x05AB0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {208} normal block at 0x059A0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {206} normal block at 0x05890040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {204} normal block at 0x05780040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {202} normal block at 0x05670040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {200} normal block at 0x05560040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {198} normal block at 0x05450040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {196} normal block at 0x05340040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {194} normal block at 0x05230040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {192} normal block at 0x05120040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {190} normal block at 0x05010040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {188} normal block at 0x04F00040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {186} normal block at 0x04DF0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {184} normal block at 0x04CE0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {182} normal block at 0x04BD0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {180} normal block at 0x04AC0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {178} normal block at 0x049B0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {176} normal block at 0x048A0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {174} normal block at 0x04790040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {172} normal block at 0x04680040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {170} normal block at 0x04570040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {168} normal block at 0x04460040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {166} normal block at 0x04350040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {164} normal block at 0x04240040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {162} normal block at 0x04130040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {160} normal block at 0x04020040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {158} normal block at 0x03F10040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {156} normal block at 0x03E00040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {154} normal block at 0x03CF0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {152} normal block at 0x03BE0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {150} normal block at 0x03AD0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {148} normal block at 0x039C0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {146} normal block at 0x038B0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {144} normal block at 0x037A0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {142} normal block at 0x03690040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {140} normal block at 0x03580040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {138} normal block at 0x03470040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {136} normal block at 0x03360040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {134} normal block at 0x03250040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {132} normal block at 0x03140040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {130} normal block at 0x03030040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {128} normal block at 0x02F20040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {126} normal block at 0x02E10040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {124} normal block at 0x02D00040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {122} normal block at 0x02BF0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {120} normal block at 0x02AE0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {118} normal block at 0x029D0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {116} normal block at 0x028C0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {114} normal block at 0x027B0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {112} normal block at 0x026A0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {110} normal block at 0x02590040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {108} normal block at 0x02480040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {106} normal block at 0x02370040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {104} normal block at 0x02260040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {102} normal block at 0x02150040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {100} normal block at 0x02040040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {98} normal block at 0x01F30040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {96} normal block at 0x01E20040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {94} normal block at 0x01D10040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {92} normal block at 0x01C00040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {90} normal block at 0x01AF0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {88} normal block at 0x019E0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {86} normal block at 0x018D0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {84} normal block at 0x017C0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {82} normal block at 0x016B0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {80} normal block at 0x015A0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {78} normal block at 0x01490040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {76} normal block at 0x01380040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {74} normal block at 0x01270040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {72} normal block at 0x01160040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
d:\projects\_tests\memleaktest3\memleaktest3.cpp(32) : {70} normal block at 0x01050040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[4720] MemLeakTest3.exe: Native' has exited with code 0 (0x0).
Re: Почему этот код не вызывает утечку памяти?
От:
Аноним
Дата:
27.07.09 16:02
Оценка:
Очень даже вызывает утечки:
#include <crtdbg.h>
#include <iostream>
using namespace std;
class A
{
public:
~A()
{
cout << "A::~A()" << endl;
}
};
#define USE_DYNAMIC_ALLOC
class B: public A
{
public:
B()
{
#ifdef USE_DYNAMIC_ALLOC
ptr = new char[1 << 20];
#endif
}
~B()
{
#ifdef USE_DYNAMIC_ALLOC
delete[] ptr;
#endif
cout << "B::~B()" << endl;
}
#ifdef USE_DYNAMIC_ALLOC
char *ptr;
#else
char ptr[1 << 20];
#endif
};
int main()
{
#ifdef _DEBUG
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_LEAK_CHECK_DF);
#endif
for(int i = 0; i < 20; ++i)
{
A *a = new B;
delete a;
}
return 0;
}
Output:
Detected memory leaks!
Dumping objects ->
{197} normal block at 0x01E90040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{195} normal block at 0x01D80040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{193} normal block at 0x01C70040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{191} normal block at 0x01B60040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{189} normal block at 0x01A50040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{187} normal block at 0x01940040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{185} normal block at 0x01830040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{183} normal block at 0x01720040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{181} normal block at 0x01610040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{179} normal block at 0x01500040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{177} normal block at 0x013F0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{175} normal block at 0x012E0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{173} normal block at 0x011D0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{171} normal block at 0x010C0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{169} normal block at 0x00FB0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{167} normal block at 0x00EA0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{165} normal block at 0x00D90040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{163} normal block at 0x00C80040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{161} normal block at 0x00AE0040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{159} normal block at 0x00490040, 1048576 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The program '[13792] test-cpp.exe: Native' has exited with code 0 (0x0).
А>Detected memory leaks!
А>Dumping objects ->
А>{197} normal block at 0x01E90040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{195} normal block at 0x01D80040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{193} normal block at 0x01C70040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{191} normal block at 0x01B60040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{189} normal block at 0x01A50040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{187} normal block at 0x01940040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{185} normal block at 0x01830040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{183} normal block at 0x01720040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{181} normal block at 0x01610040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{179} normal block at 0x01500040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{177} normal block at 0x013F0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{175} normal block at 0x012E0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{173} normal block at 0x011D0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{171} normal block at 0x010C0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{169} normal block at 0x00FB0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{167} normal block at 0x00EA0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{165} normal block at 0x00D90040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{163} normal block at 0x00C80040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{161} normal block at 0x00AE0040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>{159} normal block at 0x00490040, 1048576 bytes long.
А> Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
А>Object dump complete.
А>The program '[13792] test-cpp.exe: Native' has exited with code 0 (0x0).
А>
Я же, млять, это и пишу. Теперь закамментируй строчку
#define USE_DYNAMIC_ALLOC
и утечки не будет
Re[3]: Почему этот код не вызывает утечку памяти?
От:
Аноним
Дата:
27.07.09 16:42
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Я же, млять, это и пишу. Теперь закамментируй строчку А>
А>#define USE_DYNAMIC_ALLOC
А>
А>и утечки не будет
А Вас не смущает, что при статическом выделении освобождается память не только массивов, но и других простых переменных-членов класса, int a; например.
А>#include <iostream>
class C
{
public:
C():i(new int()){}
int * i;
~C()// сюда он не попадёт
{
delete i;
}
};
А>using namespace std;
А>class A
А>{
А>public:
А> ~A()
А> {
А> cout << "A::~A()" << endl;
А> }
А>};
А>class B: public A
А>{
А>public:
А> B()
А> {
А> }
А>~B()
А> {
А> cout << "B::~B()" << endl;
А> }
А> char C[1 << 20];
А>};
А>int _tmain(int argc, _TCHAR* argv[])
А>{
А> for(int i = 0; i < 100000; ++i)
А> {
А> A *a = new B;
А> delete a;
А> }
А> return 0;
А>}
А>
если продебагить процесс delete то видно, что размер выделенной памяти у него записан отдельно. Так что в случае где деструктор мемберов не актуален всё будет пучком. А в остальных последствия со всеми вытекающими...
Стандарта под рукой нет, но есть цитата из книги Мейерса:
... в спецификации C++ постулируется, что когда объект производного класса уничтожается через указатель на базовый класс с невиртуальным деструктором, то результат неопределен.
Ну а почему при undefined behavior происходит некое событие, мы можем только гадать. Правильный ответ знают только разработчики компилятора, который вы используете.
А>Я же, млять, это и пишу. Теперь закамментируй строчку А>
А>#define USE_DYNAMIC_ALLOC
А>
А>и утечки не будет
Люди тратят свое время чтобы влезать в твой говнокод, а ты еще и ругаешься.
Попробуй закомментируй макрос в коде с моими изменениями — найдешь утечку.
Есть она, есть.
Re[4]: Почему этот код не вызывает утечку памяти?
От:
Аноним
Дата:
27.07.09 19:19
Оценка:
Здравствуйте, R.O. Prokopiev, Вы писали:
А>>Я же, млять, это и пишу. Теперь закамментируй строчку А>>
А>>#define USE_DYNAMIC_ALLOC
А>>
А>>и утечки не будет
ROP>Люди тратят свое время чтобы влезать в твой говнокод, а ты еще и ругаешься.
ROP>Попробуй закомментируй макрос в коде с моими изменениями — найдешь утечку. ROP>Есть она, есть.
Просто в Вашем коде 2 макроса #define USE_DYNAMIC_ALLOC
Наверное Вы забыли закомментировать одну из них. Отсюда и утечки.
Не должно быть никаких утечек.
Здравствуйте, Аноним, Вы писали:
ROP>>Попробуй закомментируй макрос в коде с моими изменениями — найдешь утечку. ROP>>Есть она, есть.
А>Просто в Вашем коде 2 макроса #define USE_DYNAMIC_ALLOC А>Наверное Вы забыли закомментировать одну из них. Отсюда и утечки. А>Не должно быть никаких утечек.
Здравствуйте, Аноним, Вы писали:
А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
Это связано с деталями реализации динамической памяти в ОС. Функции высвобождения памяти достаточно знать только адрес выделенной памяти, всё остальной храниться в самом выделенном куске, кроме памяти запрошенной узером. Даже тип указателя не важен.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Аноним, Вы писали:
А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
Чтобы ответить на вопрос "Почему этот код не вызывает утечку памяти?", надо сначала непременно выяснить у автора вопроса, с чего это у него возникло (такое необычное) предположение о том, что этот код должен вызвать утечку памяти? Что, кто-то где-то обещал, что утечка должна иметь место?
Другими словами, когда вы задаете негативный вопрос (почему что-то не происходит), неплохо было бы пояснить сначала для присутствующих, откуда такой вопрос взялся в принципе. А то, извините, получается вопрос из разряда "Почему Луна не квадратная?".
Так как деструктор в базовом классе невиртуальный, то поведение программы — неопределенное (UB).
Можно предположить, что в какой-то конкретной реализации в первом случае деструктор не вызван и утечка видна, так как деструктор должен был освободить память, во втором случае деструктор тоже не вызван, но реализации operator delete на это плевать и он просто освобождает блок памяти, который занимал объект B, а так как массив был частью объекта, а не выделялся в динамической памяти, то и находился он в том же освобожденном блоке, потому утечки не фиксировались. Однако оба варианта программы демонстрируют неопределенное поведение.