удаление динамически размещенного объекта, содержащего вектор в C ++ STL - PullRequest
1 голос
/ 20 апреля 2010

У меня есть класс

class ChartLine{

protected:
        vector<Point> line; // points connecting the line
        CString name; //line name for legend        
        CPen pen; //color, size and style properties of the line
};

, где Точка является структурой

struct Point{
    CString x;
    double y;    
};

В main() Я динамически размещаю объекты типа ChartLine с оператором new. Если после этого я воспользуюсь delete, будет ли деструктор по умолчанию ~ChartLine() правильно отменять (или очищать) член ChartLine::line (что является вектором кстати), или мне придется очистить этот вектор в ~ChartLine() вручную?

Заранее спасибо. Приветствия.

Ответы [ 4 ]

5 голосов
/ 20 апреля 2010

Неявно созданный деструктор вызовет деструктор всех членов (в обратном порядке, в котором они объявлены в классе). vector очистит после себя. Вам не нужно определять деструктор самостоятельно.

Вот почему вы должны предпочесть автоматическое распределение в сочетании с RAII. Когда объекты очищаются, ваш код становится безопаснее и проще. Подсказка: не используйте новые и удаляйте, поместите их в умный указатель!

std::auto_ptr<int> p(new int(5));
boost::shared_ptr<int> p = boost::make_shared<int>(5);

Оба из них будут удалены автоматически, и теперь вы также в безопасности. (Обратите внимание, что два выше не делают то же самое. Есть также больше типов умных указателей.)

2 голосов
/ 20 апреля 2010

Да, когда вектор уничтожается, все объекты в векторе уничтожаются. Судя по всему, ваш код должен работать как есть (хотя при условии, что CString - это MFC, некоторые старые версии имели некоторые утечки памяти ...)

1 голос
/ 20 апреля 2010

Единственный раз, когда вам нужно беспокоиться о векторах (или других контейнерах) в деструкторе, это если они содержат указатели на объекты. Так как это не так в вашем случае, вы должны быть в порядке.

0 голосов
/ 20 апреля 2010

Единственный раз, когда вам нужно позвонить delete, это после того, как вы позвонили new. Все остальное обрабатывается.

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