shared_ptr

文章展示了C++中使用`unordered_map`存储`shared_ptr`对象,并在多线程环境下操作这些对象的情况。主要讨论了`shared_ptr`的`use_count()`方法,线程同步问题以及对象生命周期管理,包括析构函数的调用。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <memory>
#include <unordered_map>
#include <vector>
#include <thread>

#include <windows.h>

using namespace std;
class A {
public:
    A(string a) : name_(a) {
        cout << "A" << endl;
    }
    ~A() {
        cout << "~A"<<endl;
    }
    string name_;
};

std::unordered_map<std::string, std::shared_ptr<A>> indexMap_;
void AddIndex(const std::string& indexName)
{
    std::shared_ptr<A> newIndex = std::make_shared<A>("default");  //这里打印A
    cout << "move!!!" << endl;
    indexMap_[indexName] = std::move(newIndex); //不会再调用构造函数
}
int main() {
    AddIndex("a");
    std::vector<std::shared_ptr<A>> indexes;
    indexes.reserve(indexMap_.size());
    for (auto& indexPair : indexMap_) {
        indexes.emplace_back(indexPair.second); //不会调用构造函数
    }

    cout << indexMap_["a"].use_count() << endl; //2
    std::thread t1([&]() {
        Sleep(2000);
        cout << indexes.front().use_count() << endl; //1
        cout << indexes.front()->name_<<endl;
        indexes[0].reset(); //这里会调用~A
        cout << "all reset!!!" << endl;

     });
    std::thread t2([&]() {
        auto found = indexMap_.find("a");
        if (found != indexMap_.end()) {
            indexMap_["a"].reset();
            cout << indexMap_["a"].use_count() << endl; //0?????
            indexMap_.erase(found);
            return;
        }
    });
    t1.join();
    t2.join();

    std::cout << "Hello, World!" << std::endl;
    return 0;
}

输出:

A
move!!!
2
0
1
default
~A
all reset!!!
Hello, World!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值