Есть перегрузка оператора delete такая:
void_cdecl operator delete(void*_Block, size_t_Size).
Мне нужно удалить объект struct.
Как Я понимаю, void*_Block это и есть мой объект, но что за size_t_Size??
Александр, size_t определен в stddef.h. Это беззнаковое целое. В х32 системах имеет размер 4 байта (32 разряда). В х64 системах - 8 байт (64 разряда).
А размер структуры разве постоянный?
Размер структуры постоянный. Структуры всегда описываются конкретно и компилятор может вычислить их размер, и вы то же, кстати. Размер структуры можно узнать так: sizeof(struct mystruct)
В оператор delete размер структуры передается автоматически.
Обычно достаточно переопределить оператор void operator delete ( void* ptr ) https://en.cppreference.com/w/cpp/memory/new/opera...
res2001, не помогает не указание размера, не переопределение.
Следующая ошибка :
void __CRTDECL operator delete(void* const block) noexcept
{
#ifdef _DEBUG
_free_dbg(block, _UNKNOWN_BLOCK);
#else
free(block);
#endif
}
И вылетает надпись, что мой проект exe вызвал срабатывание точки останова.
а почему просто оператор не может удалить объект без указания размера
Может. Я вам дал ссылку на статью посвященную различным вариантам оператора delete. Вариант 1 (по ссылке) как раз без размера. Такой и реализуется в std, по моему. Кстати, там есть примеры.
Александр, Трудно что-то сказать. Вы код не приводите, ошибку полностью то же.
Зачем вам понадобился свой delete? Надеюсь к нему есть парный new?
Можете запустить под отладчиком, если вывалится с ошибкой, то в отладчике можно будет хотя бы пройти по стеку вызовов до вашего кода и посмотреть, что вызвало ошибку.
res2001, весь код не могу выложить. Ошибку Я писал, вы ответили "Тут нет ошибки. Точка останова - это не ошибка."
Тогда ответьте на вопрос.
class A. базовый класс.
class B: public class A. Класс B производный.
Могу ли Я выделить память следующий образом:
A* obj;
obj = new B;
Александр, Можете. Не забудьте сделать деструктор базового класса виртуальным, иначе работать не будет. Указатель на потомка не обязательно совпадает с указателем на родителя и кроме того при удалении деструктор потомка должен будет вызваться то же.
И лучше явно кастить указатель возвращенный new.
весь код не могу выложить
Вас никто и не просит весь код выкладывать, достаточно значимой для анализа ошибки части. Вы же по сути не привели вообще ничего. Хотя и с ошибкой пока не все ясно :)
Ошибку Я писал
Вот именно, что это вы писали. Это ваша интерпретация того что произошло.
А что произошло на самом деле мне не известно. Из вашей интерпретации я этого то же понять не могу. Есть вероятность, что вы не правильно интерпретировали произошедшее.
Скриншот или полный текст ошибки тут был бы более полезен, чем ваши домыслы.