班级地图中的智能指针?

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

我正在尝试在地图中插入对象,建议我使用指针,所以这是我的代码:

#include <iostream>
#include <map>
#include <memory>

class Person
{
private:
    int m_age;
    std::string m_name;

public:
    Person(int age, std::string name):
    m_age(age),
    m_name(name)
    {
        
    };
    
    void PrintPerson()
    {
        std::cout << "name: " << m_name << "\n";
        std::cout << "age: " << m_age << "\n";
    }
};

int main()
{
    std::map<size_t, Person*> person_map;
    
    for (int n = 0; n < 10; ++n)
    {
        person_map.insert(std::make_pair(n, new Person(n, std::to_string(n))));
    }
    
    for (int n = 0; n < 10; ++n)
    {
        person_map.at(n)->PrintPerson();
    }
    return 0;
}

我的问题是我的代码中有一个新的,但我没有看到删除。这段代码会导致内存泄漏吗?如果是这样,我可以使用智能指针来防止这种情况吗?或者管理此实施的正确方法应该是什么?谢谢你。

c++ class pointers smart-pointers stdmap
1个回答
0
投票

这段代码会导致内存泄漏吗?

是的

我可以使用智能指针来防止这种情况吗?

是的,但是对于您给出的示例,您根本不需要指针。

int main()
{
    std::map<size_t, Person> person_map;
    
    for (int n = 0; n < 10; ++n)
    {
        person_map.emplace(n, Person(n, std::to_string(n)));
    }
    
    for (int n = 0; n < 10; ++n)
    {
        person_map.at(n).PrintPerson();
    }
    return 0;
}

如果您确实需要指针(例如

Person
有虚拟方法,并且您用
person_map
的子类实例填充
Person
),则应默认使用
std::unique_ptr

int main()
{
    std::map<size_t, std::unique_ptr<Person>> person_map;
    
    for (int n = 0; n < 10; ++n)
    {
        person_map.emplace(n, std::make_unique<Person>(n, std::to_string(n)));
    }
    
    for (int n = 0; n < 10; ++n)
    {
        person_map.at(n)->PrintPerson();
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.