Почему этот код не вызывает утечку памяти?
От: Аноним  
Дата: 27.07.09 14:16
Оценка:
#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. Деструктор специально не виртуальный, для того чтобы вызывать утечку.
Re: Почему этот код не вызывает утечку памяти?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 27.07.09 14:22
Оценка:
Здравствуйте, Аноним, Вы писали:

[]

А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.


Как проверялось "отсутствие утечек"?
Re: Почему этот код не вызывает утечку памяти?
От: vvv104  
Дата: 27.07.09 14:22
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.


Это был вопрос или вы сами на него ответили? Потому что не вызывается деструктор B.
Re[2]: Почему этот код не вызывает утечку памяти?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 27.07.09 14:24
Оценка:
Здравствуйте, vvv104, Вы писали:

V>Это был вопрос или вы сами на него ответили? Потому что не вызывается деструктор B.


Поэтому нет утечек памяти? Вы вопрос-то читали?
Re[3]: Почему этот код не вызывает утечку памяти?
От: vvv104  
Дата: 27.07.09 14:29
Оценка:
Здравствуйте, Alxndr, Вы писали:

A>Здравствуйте, vvv104, Вы писали:


V>>Это был вопрос или вы сами на него ответили? Потому что не вызывается деструктор B.


A>Поэтому нет утечек памяти? Вы вопрос-то читали?


А, не так прочитал вопрос. Звиняйте Ну тогда резонный вопрос, как проверялось отсутствие утечек.
Re[2]: Почему этот код не вызывает утечку памяти?
От: Аноним  
Дата: 27.07.09 14:29
Оценка:
Здравствуйте, Alxndr, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>[]


А>>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.


A>Как проверялось "отсутствие утечек"?


Скомпиль, запусти, открой диспетчер процессов и посмотри используемую память.
Re[3]: Почему этот код не вызывает утечку памяти?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 27.07.09 14:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.


A>>Как проверялось "отсутствие утечек"?


А>Скомпиль, запусти, открой диспетчер процессов и посмотри используемую память.


(Сначала написал фигню про empty based class optimization — невнимательно посмотрел код)

AFAIK, многие реализации new размещают служебную информацию о том, сколько памяти было выделенно. Соответственно, delete пользуется этой информацией, и удаляет всю память, занимаемую B.
Re: Почему этот код не вызывает утечку памяти?
От: Fwiffo Россия  
Дата: 27.07.09 14:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>#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
Re: Почему этот код не вызывает утечку памяти?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 27.07.09 14:50
Оценка:
Лики есть и еще какие.
Модифицированный код с отловом утечек:


#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).
Re[2]: Почему этот код не вызывает утечку памяти?
От: Аноним  
Дата: 27.07.09 16:18
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Очень даже вызывает утечки:

А>
А>#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).
А>


Я же, млять, это и пишу. Теперь закамментируй строчку
#define USE_DYNAMIC_ALLOC

и утечки не будет
Re[3]: Почему этот код не вызывает утечку памяти?
От: Аноним  
Дата: 27.07.09 16:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я же, млять, это и пишу. Теперь закамментируй строчку

А>
А>#define USE_DYNAMIC_ALLOC
А>

А>и утечки не будет

А Вас не смущает, что при статическом выделении освобождается память не только массивов, но и других простых переменных-членов класса, int a; например.
Re: Почему этот код не вызывает утечку памяти?
От: Caracrist https://1pwd.org/
Дата: 27.07.09 17:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>#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 то видно, что размер выделенной памяти у него записан отдельно. Так что в случае где деструктор мемберов не актуален всё будет пучком. А в остальных последствия со всеми вытекающими...
~~~~~
~lol~~
~~~ Single Password Solution
Re: Почему этот код не вызывает утечку памяти?
От: Eugene Sh Россия  
Дата: 27.07.09 17:37
Оценка: 1 (1) +1
Стандарта под рукой нет, но есть цитата из книги Мейерса:

... в спецификации C++ постулируется, что когда объект производного класса уничтожается через указатель на базовый класс с невиртуальным деструктором, то результат неопределен.


Ну а почему при undefined behavior происходит некое событие, мы можем только гадать. Правильный ответ знают только разработчики компилятора, который вы используете.
Re[3]: Почему этот код не вызывает утечку памяти?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 27.07.09 18:02
Оценка: +1
А>Я же, млять, это и пишу. Теперь закамментируй строчку
А>
А>#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
Наверное Вы забыли закомментировать одну из них. Отсюда и утечки.
Не должно быть никаких утечек.
Re[5]: Почему этот код не вызывает утечку памяти?
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 27.07.09 19:47
Оценка:
Здравствуйте, Аноним, Вы писали:

ROP>>Попробуй закомментируй макрос в коде с моими изменениями — найдешь утечку.

ROP>>Есть она, есть.

А>Просто в Вашем коде 2 макроса #define USE_DYNAMIC_ALLOC

А>Наверное Вы забыли закомментировать одну из них. Отсюда и утечки.
А>Не должно быть никаких утечек.

Точно! Проклятая невнимательность.
Нет утечек.
Re: Почему этот код не вызывает утечку памяти?
От: Vain Россия google.ru
Дата: 27.07.09 21:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.

Это связано с деталями реализации динамической памяти в ОС. Функции высвобождения памяти достаточно знать только адрес выделенной памяти, всё остальной храниться в самом выделенном куске, кроме памяти запрошенной узером. Даже тип указателя не важен.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Почему этот код не вызывает утечку памяти?
От: Андрей Тарасевич Беларусь  
Дата: 27.07.09 23:10
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Если память выделяется динамически — утечка есть. Если не динамически, то утечки нет. Чтобы включить/выключить используйте макрос USE_DYNAMIC_ALLOC. Деструктор специально не виртуальный, для того чтобы вызывать утечку.


Чтобы ответить на вопрос "Почему этот код не вызывает утечку памяти?", надо сначала непременно выяснить у автора вопроса, с чего это у него возникло (такое необычное) предположение о том, что этот код должен вызвать утечку памяти? Что, кто-то где-то обещал, что утечка должна иметь место?

Другими словами, когда вы задаете негативный вопрос (почему что-то не происходит), неплохо было бы пояснить сначала для присутствующих, откуда такой вопрос взялся в принципе. А то, извините, получается вопрос из разряда "Почему Луна не квадратная?".
Best regards,
Андрей Тарасевич
Re: Почему этот код не вызывает утечку памяти?
От: Аноним  
Дата: 28.07.09 05:01
Оценка: 1 (1) +2
Так как деструктор в базовом классе невиртуальный, то поведение программы — неопределенное (UB).
Можно предположить, что в какой-то конкретной реализации в первом случае деструктор не вызван и утечка видна, так как деструктор должен был освободить память, во втором случае деструктор тоже не вызван, но реализации operator delete на это плевать и он просто освобождает блок памяти, который занимал объект B, а так как массив был частью объекта, а не выделялся в динамической памяти, то и находился он в том же освобожденном блоке, потому утечки не фиксировались. Однако оба варианта программы демонстрируют неопределенное поведение.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.