【发布时间】:2016-12-30 07:59:11
【问题描述】:
我有一个工厂方法,它创建一堆对象并返回指向它们的指针。对象的所有权转移给调用者:
std::vector<animal*> create_zoo();
这可行,但容易出现内存泄漏。
auto zoo = create_zoo();
向量在堆栈上并被自动清理,包含的对象不是。
返回各种子类型的对象。返回值而不是指针是不行的。
我想用
std::vector<std::unique_ptr<animal> > create_zoo();
但unique_ptr 没有复制语义,我按值返回vector,理论上它会创建一个副本。
我可以将vector 放在堆上以避免这种情况
std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo();
但这越来越荒谬了。
这应该也可以:
std::vector<std::shared_ptr<animal> > create_zoo();
这可行,但不会真正转移所有权。调用者必须假设可能有其他指向对象的指针。
我愿意接受建议。不需要是std::vector。我只是在寻找一种实现工厂的好方法,该工厂使用现代 c++ 返回多个对象的所有权。我暂时避免提升。我正在尝试探索新的 c++11 内容。
【问题讨论】:
-
您还可以重新考虑是否需要将动物对象分配为指针。
std::vector<animal>也可能适用于您的目的。动物对象将与向量一起分配,并在移动操作后随其移动。
标签: c++ c++11 pointers vector smart-pointers