delete для того на что указывает void*
От: Sagrer  
Дата: 24.08.06 17:59
Оценка:
сорри за тупой вопрос, но MSDN что-то не хочет давать пояснений по субжу, учебник по C++ тоже неособо....


В общем — есть код — что-то типа

void* testvar = new wxString();
....
....
чего-то делаем c testvar
....
....
delete testvar;

При компиляции этого в gcc — выводится такой варнинг:

MhbFile.cpp:40: warning: deleting `void*' is undefined

Собсно вопрос — можно ли так удалять void*-ы и не будет ли при этом утечек памяти?

wxString — класс. В том же самом коде тот же testvar может указывать на переменные других типов (на самом деле void* объявляется при объявлении класса, а new выполняется в коде класса — смотря в каком методе — разный тип, а в деструкторе класса это все надо бы чистить...)
Re: delete для того на что указывает void*
От: Молодой Россия  
Дата: 24.08.06 18:03
Оценка:
S>MhbFile.cpp:40: warning: deleting `void*' is undefined

S>Собсно вопрос — можно ли так удалять void*-ы и не будет ли при этом утечек памяти?


S>wxString — класс. В том же самом коде тот же testvar может указывать на переменные других типов (на самом деле void* объявляется при объявлении класса, а new выполняется в коде класса — смотря в каком методе — разный тип, а в деструкторе класса это все надо бы чистить...)


Он тебе мягко и непринужденно говорит
Память то я суть покиляю эти самые 4 байта, но вот
кто вызовет деструктор для твоего класса
Re[2]: delete для того на что указывает void*
От: Sagrer  
Дата: 24.08.06 19:08
Оценка:
М>Он тебе мягко и непринужденно говорит
М>Память то я суть покиляю эти самые 4 байта, но вот
М>кто вызовет деструктор для твоего класса

а если там не класс а что-то типа double или bool? Эта память освобождается простым delete и достаточно особо позаботиться только о ситуации когда void* указывает на объект класса?
Re[3]: delete для того на что указывает void*
От: shank  
Дата: 24.08.06 19:22
Оценка:
Здравствуйте, Sagrer, Вы писали:

М>>Он тебе мягко и непринужденно говорит

М>>Память то я суть покиляю эти самые 4 байта, но вот
М>>кто вызовет деструктор для твоего класса

S>а если там не класс а что-то типа double или bool? Эта память освобождается простым delete и достаточно особо позаботиться только о ситуации когда void* указывает на объект класса?


В общем случае это undefined behavior. 5.3.5/3
Re[3]: delete для того на что указывает void*
От: Молодой Россия  
Дата: 25.08.06 06:42
Оценка:
Здравствуйте, Sagrer, Вы писали:

М>>Он тебе мягко и непринужденно говорит

М>>Память то я суть покиляю эти самые 4 байта, но вот
М>>кто вызовет деструктор для твоего класса

S>а если там не класс а что-то типа double или bool? Эта память освобождается простым delete и достаточно особо позаботиться только о ситуации когда void* указывает на объект класса?


Что бы убить реальный объект, нужно
знать его тип.
Дабол чар или что — то еще.
Деструктор в данном случае не определен.
Освободится только 4 байта
Re: delete для того на что указывает void*
От: last_hardcoder  
Дата: 25.08.06 06:49
Оценка: +1
Здравствуйте, Sagrer, Вы писали:

S>void* testvar = new wxString();

S>....
S>....
S>чего-то делаем c testvar
S>....
S>....
S>delete testvar;

S>При компиляции этого в gcc — выводится такой варнинг:


S>MhbFile.cpp:40: warning: deleting `void*' is undefined


S>Собсно вопрос — можно ли так удалять void*-ы и не будет ли при этом утечек памяти?


S>wxString — класс. В том же самом коде тот же testvar может указывать на переменные других типов (на самом деле void* объявляется при объявлении класса, а new выполняется в коде класса — смотря в каком методе — разный тип, а в деструкторе класса это все надо бы чистить...)



delete static_cast<wxString*>(testvar);
Re[2]: delete для того на что указывает void*
От: RSDN_YG Россия  
Дата: 26.08.06 03:31
Оценка:
Здравствуйте, last_hardcoder, Вы писали:

S>>void* testvar = new wxString();


S>>delete testvar;


S>>wxString — класс. В том же самом коде тот же testvar может указывать на переменные других типов (на самом деле void* объявляется при объявлении класса, а new выполняется в коде класса — смотря в каком методе — разный тип, а в деструкторе класса это все надо бы чистить...)


_>delete static_cast<wxString*>(testvar);


Все — таки безопаснее наверное прикрутить обычное наследование?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.