我正在阅读 Effective Modern C++ (Scott Meyers) 并尝试第 21 项中的一些内容。这本书说使用的副作用是在所有s 和s 都消失std::make_shared
之前无法释放内存(因为控制块与内存一起分配)。shared_ptr
weak_ptr
我预计这将意味着如果我保留一个缓存来保存一堆weak_ptr
s,那么就不会释放任何内存。我使用下面的代码进行了尝试,但是由于从向量中删除了 shared_ptrs,我可以使用 pmap 看到实际上正在释放内存。谁能解释我哪里出错了?或者如果我的理解是错误的?
注:loadWidget
本实验的目的与书中的功能不同。
#include <iostream>
#include <memory>
#include <unordered_map>
#include <vector>
#include <thread>
#include <chrono>
class Widget {
public:
Widget()
: values(1024*1024, 3.14)
{ }
std::vector<double> values;
};
std::shared_ptr<Widget> loadWidget(unsigned id) {
return std::make_shared<Widget>();
}
std::unordered_map<unsigned, std::weak_ptr<Widget>> cache;
std::shared_ptr<Widget> fastLoadWidget(unsigned id) {
auto objPtr = cache[id].lock();
if (!objPtr) {
objPtr = loadWidget(id);
cache[id] = objPtr;
}
return objPtr;
}
int main() {
std::vector<std::shared_ptr<Widget>> widgets;
for (unsigned i=0; i < 20; i++) {
std::cout << "Adding widget " << i << std::endl;
widgets.push_back(fastLoadWidget(i));
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
while (!widgets.empty()) {
widgets.pop_back();
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
return 0;
}