我在这里问了一个非常相似的问题,但由于这是一个非常基本的问题,我想更准确地陈述我的(新)问题。
假设我有一个非常复杂的 A 类,并且 A 的每个实例都存储在多个容器中,例如向量、队列、......
即使在静态设置中,这意味着对象被添加到容器中一次并且不会被删除或修改:
容器现在应该包含指向对象的指针还是对象本身?
如果您需要对象的副本 - 使用对象。如果您需要共享对象或需要多态行为,请使用smart pointers
. 如果使用智能指针,您将同时拥有自动对象销毁和多态行为。
例如:
std::vector<std::shared_ptr<MyObject>> v;
auto ptr = std::shared_ptr<MyObject>(new MyObject());
v.push_back(ptr);
如果您需要存储唯一指针(不共享):
std::vector<std::unique_ptr<MyObject>> v;
auto ptr = std::unique_ptr<MyObject>(new MyObject());
v.push_back(std::move(ptr));
如果每个实例A
都存储在多个容器中,那么您必须存储(智能)指针而不是对象本身。否则,每个容器都会有自己唯一的副本。修改一个容器中的实例不会影响其他容器。即使您没有修改任何内容,存储完整的对象副本也不能说明您的意思,即跨容器的实例实际上是相同的。
如果您的对象很大,或者复制成本高或复制复杂,则存储智能指针。