【发布时间】:2019-12-18 00:48:20
【问题描述】:
这里有一个 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
- 从输出中,我想知道,如何删除给定
new Person(2)的test映射的值,而无需像先编码一样
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
- 我不明白为什么构造函数运行一次而复制构造函数运行两次。你能解释一下他们发生在哪里吗?
谢谢。
【问题讨论】:
-
听起来你可以使用good C++ book
-
我在这里看不到任何未定义的行为。在指针情况下,您的析构函数不会运行,但那是因为没有
delete。您可以通过使用智能指针而不是原始指针来纠正此问题。但是在这里使用值而不是指针并没有错。.. -
@wangmyde 你不能测试未定义的行为,你必须知道。而且C++中没有“新指针”或“未定义指针”之类的东西,如果你想被理解,你应该使用通用术语。
-
在 4. 你创建了
Person临时,它被复制以构造pair<>临时,并再次复制到插入函数中。 -
@wangmyde 这就像用
doSomething(2);而不是int i = 2; doSomething(i);- 也就是说,它没有任何区别。
标签: c++ new-operator heap-memory copy-constructor delete-operator