удалить перегрузку, рекурсивное переполнение - PullRequest
1 голос
/ 14 января 2009

Эй, ребята, я написал быстрый тест. Я хочу удалить, чтобы вызвать deleteMe, который затем удалит себя. Цель этого состоит в том, чтобы я мог обычно удалять obj, которые выделяются библиотекой lib. (Я не хочу никаких сбоев из-за КРТ или ж / д).

При удалении этого я получаю переполнение стека, без него msvc говорит, что я пропустил 4 байта. Когда я не вызываю test, я теряю 0. Как удалить без рекурсии проблему? -редактировать- чтобы сделать это более понятным. Я хочу, чтобы LIB вызывал delete (то есть deleteMe) вместо программы из-за crt

class B
{
public:
    virtual void deleteMe()=0;
    static void operator delete (void* p) { ((B*)p)->deleteMe(); }
};

class D : public B
{
public:
    void deleteMe()      {
        delete this;
    }
};

int test()
{
    B *p = new D;
    delete p;
    return 0;
}

Ответы [ 3 ]

1 голос
/ 14 января 2009

Рекурсия вызвана deleteMe вызовом delete, который вызывает B's operator delete, что снова вызывает deleteMe. Можно перегрузить operator delete (хотя обычно вы также перегружаете operator new), особенно при обработке «посторонних» объектов, что, скорее всего, является вашим случаем, однако вы, в свою очередь, должны вызывать реальную процедуру очистки из пользовательского delete.

В общем случае перегруженный operator delete должен соответствовать operator new. В вашем случае:

B *p = new D;

Здесь p выделяется с глобальным new, поэтому он должен быть освобожден с глобальным delete. Итак:

class D : public B
{
public:
    void deleteMe()      {
        ::delete this;
    }
};
1 голос
/ 14 января 2009

Вы не должны отменять удаление. Особенно, если это не функция, вызывающая удаление. Любое освобождение памяти, которое вам нужно сделать (и вам не нужно ничего делать в этом примере), должно выполняться в деструкторе.

0 голосов
/ 14 января 2009

Возможно, вам лучше иметь метод Destroy (), который должны вызывать ваши клиенты ... это защитит вашу библиотеку от различий в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...