2016-10-17 10 views
2

Привет в классе каст X У меня естьstd :: map <struct, int> Нужен ли мне деструктор?

class X{ 
    private: 
     std::map<some_struct, int> C; 
} 

Где some_struct определяется как:

typedef struct{ 
    int a; 
    int b; 
    int c; 
}some_struct; 

Мой вопрос: нужно ли мне указывать что-либо о карте С в деструкторе Х? Если да, то какое действие должен сделать деструктор X для карты C?

+0

сделать функцию удалить или стирать функцию, которая проходит через каждый элемент и стирает/удаляет ее с карты и вызывает эту функцию в деструкторе класса X. –

+3

@OmidCompSCI, пожалуйста, не делайте этого. деструктор 'std :: map' делает это более эффективным образом –

+4

, вы должны просто следовать правилу нуля: http://en.cppreference.com/w/cpp/language/rule_of_three https://rmf.io/cxx11/rule-of-zero/ –

ответ

5

Нет, вам не нужно указывать деструктор для some_struct или class X

Для любых типов он генерируется компилятором автоматически. До тех пор, пока не было явно выделено классом в динамическом хранилище с new или new [], вам не нужно писать деструктор, который применяет операцию delete или delete[].


Кроме того, для написания кода С ++ (по сравнению с с) вы не должны использовать этот typedef синтаксис:

struct some_struct { 
    int a; 
    int b; 
    int c; 
}; 
+1

Деструктор генерируется для всех типов. – NathanOliver

+1

. Все классы имеют деструктор, сгенерированный автоматически. –

+0

«До тех пор, пока не было явно выделенного класса ...» Класс, на который ссылается, является X. Если some_struct выделяет память, которая должна быть освобождена в деструкторе sone_struct. – Carl

2

До тех пор, пока вы не вводить new операторы, вы хорошо пойдите с деструктором по умолчанию.

ВСЕ Контейнеры STL (карта, вектор, список, deque и т. Д.) Не нуждаются в специальных деструкторах. Они самодостаточны и тщательно разработаны, чтобы уничтожить себя, когда вы выходите из сферы действия.

+0

Оператор 'new' не является хорошим индикатором того, что вам нужен деструктор или нет. Я могу иметь 'unique_ptr (new some_struct)' и все еще сохранять –

+0

@BryanChen все еще выполняется утверждение «если нет нового, у вас все в порядке с деструктором по умолчанию». Это не означает обратное: если у вас есть новый, то вам нужно больше, чем дефолтор по умолчанию, поскольку ваш пример счетчика демонстрирует – user463035818

+0

@BryanChen вы можете это сделать, но это ошибка. Если конструктор интеллектуального указателя бросает, то вы просочились в память. Это одна из причин, по которым следует использовать функции make – NathanOliver

0

Вам нужно будет беспокоиться о C в деструкторе, если бы вы динамически распределяемой объект на куче с new оператора, например:

class X{ 
    public: 
     X(); 
    private: 
     std::map<some_struct, int> *p_C; 
} 

И в определении:

X::X() { 
    p_C = new map<some_struct, int>(); 
} 

X::~X() { 
    if(p_C) delete p_C; 
} 
+1

нет, вы этого не сделали, потому что в этом случае вы будете использовать интеллектуальные указатели – BeyelerStudios

+0

Что такое _heap_ с помощью C++ стандарты? –

+1

@ πάνταῥεῖ, который сейчас nitpicking: P –