我看到很多人使用
谢谢
vector<shared_ptr<T>>
。何时和为什么会使用shared_ptr<vector<T>>
呢?对我来说,后者在性能和内存使用方面似乎更有效率。在应用程序中共享单个对象向量是错误的吗?谢谢
vector<shared_ptr<T>>
。何时和为什么会使用shared_ptr<vector<T>>
呢?对我来说,后者在性能和内存使用方面似乎更有效率。在应用程序中共享单个对象向量是错误的吗?使用 vector<shared_ptr<T>>
可以让你将类型为 T
的实例从该向量传递给代码的其他部分,而无需担心它们是否会被释放。即使你的向量不再存在。
另一方面,shared_ptr<vector<T>>
仅保护向量本身,其元素(类型为 T
)不受内存泄漏的保护。我假设这里的 T
是指针类型,如果 T
不是指针,则在此处制造内存泄漏就不是问题了。当然,有人可能会实际上将 T = shared_ptr<T>
。
实际上,更常见的是使用 vector<shared_ptr<T>>
,我真的不记得使用过 shared_ptr<vector<T>>
。
关键在于,在代码中永远不要保留分配的内存的裸指针,始终将它们保存在某种智能指针中。如果使用 RAII 实现自己的分配/释放机制,也是完全可以的。
std::vector<std::shared_ptr<T>>
表示共享指针的向量,而std::shared_ptr<std::vector<T>>
则表示一个向量的共享指针。两者有很大的区别。 - Some programmer dudestd::shared_ptr<std::vector<T>>
?(这种类型假定动态分配了一个std::vector
,而动态分配std::vector
的情况非常罕见。) - James Kanze-D_GLIBCXX_CONCEPT_CHECKS
。当然,它将无法在某些未来的标准版本中编译;概念的目标是使其成为需要诊断的错误。) - James KanzeQueryResult(string s, shared_ptr<set<line_no>, shared_ptr<vector<string>>>)
,并将指针复制到成员变量中。另外,我同意它容易被误解,特别是那些来自Java/C#的人,但更普遍的是,想要为容器使用shared_ptr
的所有合法原因与单个数据的原因并没有太大区别——容器的生命周期需要解耦和所有权分散... - Tony Delroy