未定义的新运算符如何导致C ++中的未定义行为?

问题描述 投票:-1回答:1

这里有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
  1. 从输出中,我想知道如何删除给定testnew Person(2)映射的值而无需像第一个那样进行编码
Person* per = new Person(2)
test.insert(pair<string, Person*>("ini_1", per));

delete per;
  1. 没有像这样先定义
Person* per = new Person(2)
test.insert(pair<string, Person*>("ini_1", per));

会导致不确定的行为吗?您能否描述未定义行为的更多细节?特别是它在内存中如何存在?谢谢。

  1. 如果不正确,我可以这样使用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
  1. 我不明白为什么构造函数运行一次,而复制构造函数运行两次。您能解释一下发生的地方吗?

谢谢。

c++ new-operator heap-memory copy-constructor delete-operator
1个回答
0
投票

从输出中,我可以看到析构函数没有运行。我想要知道,如何在不定义新指针的情况下将其删除?

您声明了;指向人的指针的地图

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类型的复制构造函数作为该对的第二个数据成员。

因此创建了三个对象,并为这些对象调用了三个析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.