首页 > 解决方案 > 这是使用 unique_ptr 避免泄漏的最佳方法吗?

问题描述

我是初学者,我正在努力了解内存泄漏。

下面的代码是否有任何泄漏?unique_ptr使用vectorand有意义map吗?

我的目的主要是为了提高代码的性能和最小的容忍度。如果此代码错误,请告诉我我在哪里出错。

typedef struct MyStruct
{
    std::string name;
    int age;
} tMyStruct;

typedef std::map<std::unique_ptr<MyStruct>, std::unique_ptr<MyStruct>> den_mp;
typedef std::vector< std::unique_ptr<MyStruct> > den_vec;

den_mp  m_mp;
den_vec m_vec; 

void doit(auto& mp)
{
    for (auto it = mp.begin(); it != mp.end(); it++)
    {
        std::cout << it->first->name << std::endl;
    }
}

void doit2(auto& mp)
{
    for (auto it = mp.begin(); it != mp.end(); it++)
    {
        std::cout << it->get()->name << std::endl;
    }
}

void addvec(std::string name, int age)
{
    std::unique_ptr<MyStruct> strt(new MyStruct);
    strt->age = age;
    strt->name = name;
    m_mp.emplace(std::move(strt), std::move(strt));
}

void addvec2(std::string name, int age)
{
    std::unique_ptr<MyStruct> strt(new MyStruct);
    strt->age = age;
    strt->name = name;
    m_vec.emplace_back(std::move(strt));
}

int main()
{
    addvec("ads", 10);
    addvec2("asdfg", 10);

    doit(m_mp);
    doit2(m_vec);

    std::cin.get();
}

标签: c++

解决方案


代码有泄漏吗?

不,据我所知,所示程序没有内存泄漏。

但是,这被打破了:

 m_mp.emplace(std::move(strt), std::move(strt));

如果您从某物移动两次,那么第二次移动将来自已经移动的对象。在这种情况下,唯一指针在被移动后将为空。

不能有多个指向同一个对象的唯一指针。这就是为什么它被称为“独特”。

使用 unique_ptr 矢量和地图有意义吗?

它可以。但这并不总是有意义的。当将对象本身存储为元素就足够时,它可能会不必要地低效。


推荐阅读