Я был любопытным, если вызван delfaut destructor, когда im удаляет элемент с карты. Вот пример, который я сделал:уничтожение объекта при удалении из std :: map
class CTestMap{
public:
CTestMap() {
std::cout << "default constructor called" << std::endl;
}
CTestMap(int id) {
std::cout << "created object: " << id << std::endl;
m_id = id;
}
~CTestMap() {
std::cout << "destroyed object: " << this->m_id << std::endl;
}
int get_id(){
return m_id;
}
int m_id;
};
int main(void){
std::map<int, CTestMap>m;
std::map<int, CTestMap>::iterator m_it;
std::cout << "created map " << std::endl;
CTestMap t1(1);
std::cout << "created test object: " << t1.get_id() << std::endl;
CTestMap t2(2);
std::cout << "created test object: " << t2.get_id() << std::endl;
CTestMap t3(3);
std::cout << "created test object: " << t3.get_id() << std::endl;
m[1] = t1;
m_it = m.find(1);
std::cout << "inserted test object: " << m_it->second.get_id() << std::endl;
m[2] = t2;
m_it = m.find(2);
std::cout << "inserted test object: " << m_it->second.get_id() << std::endl;
m[3] = t3;
m_it = m.find(3);
std::cout << "inserted test object: " << m_it->second.get_id() << std::endl;
m_it = m.find(1);
std::cout << "will now erased test object: " << m_it->second.get_id() << std::endl;
m.erase(m.find(1));
std::cout << "erased test object: " << m[1].get_id() << std::endl;
m_it = m.find(1);
std::cout << "object shall no longer exist: " << m_it->second.get_id() << std::endl;
while(1);
return 0;
}
здесь выход:
./htest
created map
created object: 1
created test object: 1
created object: 2
created test object: 2
created object: 3
created test object: 3
default constructor called
destroyed object: 9377935
destroyed object: 9377935
inserted test object: 1
default constructor called
destroyed object: 9377935
destroyed object: 9377935
inserted test object: 2
default constructor called
destroyed object: 9377935
destroyed object: 9377935
inserted test object: 3
will now erased test object: 1
destroyed object: 1
default constructor called
destroyed object: 158830600
destroyed object: 158830600
erased test object: 158830600
object shall no longer exist: 158830600
Вопросов:
- Почему так много раз конструктор по умолчанию вызывается, когда я только Создание 3 объектов с использованием моего собственного конструктора?
- Могу ли я, основываясь на , в этом примере сказать, что каждый раз, когда я стираю любой объект с карты , его деструктор называется? Является ли это общим поведением std :: map? Я не мог найти эту информацию.
- Что делать, если я храню указатели на объекты (им создавая их с помощью «нового» оператора)? Когда вызывается «delete»?
Создайте свой экземпляр и оператор копирования, также вы можете его распечатать. Если ваш компилятор поддерживает перемещение семантики, сделайте аналогично для своего конструктора перемещения и переместите оператор присваивания. –
Возможно, вы захотите создать конструктор-копию, чтобы лучше понять это. –
@MarkGarcia Даже если компилятор поддерживает семантику перемещения, он не будет использовать их, если у объекта есть пользовательский конструктор копирования. Простое определение конструктора копии достаточно для первого понимания. ('std :: map' никогда не использует назначение, и я думаю, что в C++ 11 для него было удалено Требование Assignable.) –