这里有C ++代码:
#include <iostream>
#include <map>
#include <string>
#include <cstdlib>
using namespace std;
class Person {
private:
int year;
Person(const Person& pers);
public:
Person(int y): year(y)
{ cout << "Default constructor" << endl;}
~Person()
{
cout << "Destructor " << endl;
}
int get_year() const
{
return year;
}
};
int main()
{
map<string, Person*> test;
test.insert(pair<string, Person*>("ini_1", new Person(2)));
return 0;
}
输出
Default constructor
test
的new Person(2)
映射的值而无需像第一个那样进行编码Person* per = new Person(2)
test.insert(pair<string, Person*>("ini_1", per));
delete per;
Person* per = new Person(2)
test.insert(pair<string, Person*>("ini_1", per));
会导致不确定的行为吗?您能否描述未定义行为的更多细节?特别是它在内存中如何存在?谢谢。
Person
代替new Person
吗?会导致任何不确定的行为吗?#include <iostream>
#include <map>
#include <string>
#include <cstdlib>
using namespace std;
class Person {
private:
int year;
public:
Person(int y): year(y)
{ cout << "constructor" << endl;}
Person(const Person& pers)
{
cout << "copy constructor" << endl;
}
~Person()
{
cout << "Destructor " << endl;
}
int get_year() const
{
return year;
}
};
int main()
{
map<string, Person> test;
test.insert(pair<string, Person>("ini_1", Person(2)));
return 0;
}
输出:
constructor
copy constructor
copy constructor
Destructor
Destructor
Destructor
谢谢。
从输出中,我可以看到析构函数没有运行。我想要知道,如何在不定义新指针的情况下将其删除?
您声明了;指向人的指针的地图
map<string, Person*> test;
因此,此语句中仅创建一次Person类型的对象
test.insert(pair<string, Person*>("ini_1", new Person(2)));
另外,地图处理的是指针而不是对象。
您将需要明确删除创建的对象。例如
for ( auto &item : test )
{
delete item.second;
item.second = nullptr;
}
我不明白为什么构造函数只运行一次并复制构造函数运行了两次。您能解释一下发生的地方吗?
在此声明中
test.insert(pair<string, Person>("ini_1", Person(2)));
转换构造函数被显式调用以创建Person Person(2)
类型的对象。
然后调用Person类的副本构造函数以创建pair<string, Person>
类型的对象。
最后,该对象再次被复制到映射,再次调用Person类型的复制构造函数作为该对的第二个数据成员。
因此创建了三个对象,并为这些对象调用了三个析构函数。