您违反了 3 的规则。您使用非平凡构造函数创建了一个对象,但未能创建析构函数或复制构造函数或operator=
.
std::vector<blah> foo(10)
创建一个默认构造的blah
,并在 中制作 10 个副本foo
。因为你违反了 3 的规则,所以这 10 个副本都是相同的。
最简单的方法是取消new
:
struct CacheNode {
std::set<int> value;
int timestamp;
CacheNode() : value(), timestamp(0) {}
};
另一种方法是使用 aunique_ptr
进行生命周期管理,并明确复制:
struct CacheNode {
std::unique_ptr<std::set<int>> value;
int timestamp;
CacheNode() : value(new std::set<int>()), timestamp(0) {}
CacheNode(CacheNode&&) = default; // C++11 feature
CacheNode(CacheNode const& other):value(new std::set<int>( *other.value ) ), timestampe(other.timestamp) {}
CacheNode& operator=(CacheNode const& other) {
value.reset(new std::set<int>(*other.value));
timestampe = other.timestamp;
return *this;
}
CacheNode& operator=(CacheNode&& other) = default;
// no need for ~CacheNode, unique_ptr handles it
};
当你想std::set<int>
取出你的CacheNode
,调用CacheNode().value.release()
并存储结果std::set<int>*
。
std::shared_ptr<std::set<int>>
将允许共享所有权std::set
。
还有其他方法,包括使您的vector
商店指针指向CacheNode
,创建value_ptr<T>
执行值语义的模板等。
在 C++11 中,这些相对容易和安全,因为std::vector
会移动事物,并且在 a 上移动语义value_ptr<T>
不会创建新的T
.
std::set<int>
我对您在不同人之间共享的计划持怀疑态度CacheNode
,因为总的来说这是难闻的气味-事物的所有权/生命周期应该很清楚,在这种情况下,您有一些CacheNode
拥有,std::set<int>
而另一些则不拥有(因为他们共享所有权)。Ashared_ptr
可以解决这个问题,但通常有更好的解决方案。