Какой деструктор вызывается, когда в C ++? - PullRequest
2 голосов
/ 22 декабря 2010

Я ищу утечки памяти в программе.

Я сузил его до того, что некоторые деструкторы не были вызваны. Однако я не могу понять, почему:

class CMain : public CList {
public:
    CMain();
    virtual ~CMain();
    ...
}

class CList : public CProc {
public:
    CList();
    virtual ~CList();
    ...
}

/* some code and a main func here */
CMain *pMain = new CMain();
/* some more code here */
delete pMain;

CMain освобождается просто отлично, но ~CList() никогда не вызывается. Все родительские классы CList также имеют виртуальные деструкторы.

У вас есть какие-нибудь подсказки о том, почему деструктор для CList никогда не вызывается?

Ответы [ 5 ]

3 голосов
/ 22 декабря 2010

Можете ли вы установить точку останова в ~ CMain, чтобы увидеть, куда она идет?

2 голосов
/ 22 декабря 2010

Может быть, где-то есть проблема с нарезкой.Просто догадываюсь ..

Что такое нарезка объектов? нет, это не тот случай.

Вы должны поместить блок try catch в ~ CMain, хммм один из егочлен выбросить исключение в деструктор?

1 голос
/ 22 декабря 2010

Поскольку вы не delete свой объект, выделенный с new.

; -)

Более серьезно, вы пошли на отладку теоретического конца области действия одноговашего CList и вступить в процесс его уничтожения, что происходит?

0 голосов
/ 22 декабря 2010

Ребенок, потом родитель.Но между ними атрибуты ребенка разрушаются.Я бы посоветовал посмотреть, работает ли ~ CMain до конца - если он работает, а ~ CList никогда не вводится, у вас есть проблема с одним из атрибутов CMain.

Просто для демонстрации:

#include <iostream>
#include <stdlib.h>

struct Owned {
    ~Owned() {
        std::cerr << "~Owned" << std::endl;
        exit(1);
    }
};

struct Parent {
    virtual ~Parent() {
        std::cerr << "~Parent" << std::endl;
    }
};

struct Owner : public Parent {
    ~Owner() {
        std::cerr << "~Owner" << std::endl;
    }

    Owned owned;
};

int main()
{
    Owner owner;
    return 0;
}

Выходы:

~Owner
~Owned

И выход с кодом возврата 1.

0 голосов
/ 22 декабря 2010

CMain освобождается просто отлично, но ~ CList () никогда не вызывается.

Звучит как неправильное утверждение.Если вызывается ~CMain, то в конечном итоге также вызывается ~CList, потому что это базовый класс.Проверьте, как вы определяете, вызывается ли деструктор.

Когда вы говорите "CMain освобождается", вы имеете в виду, что вы выпускаете delete?Убедитесь, что в момент, когда вы делаете delete pMain, определение класса CMain является видимым.В отсутствие его определения компилятору разрешается предполагать, что класс не имеет определенного пользователем или виртуального деструктора, и может не вызывать его.

...