#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!