Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何保留指向std::unique\u ptr的指针?_C++_Unique Ptr - Fatal编程技术网

C++ 如何保留指向std::unique\u ptr的指针?

C++ 如何保留指向std::unique\u ptr的指针?,c++,unique-ptr,C++,Unique Ptr,我有一个向量: std::vector<std::unique_ptr<myClass>> vec; //filling the vector vec.push_back(std::unique_ptr<myClass>(new myClass())); vec.push_back(std::unique_ptr<myClass>(new myClass())); vec.push_back(std::unique_ptr<myClass&g

我有一个向量:

std::vector<std::unique_ptr<myClass>> vec;
//filling the vector
vec.push_back(std::unique_ptr<myClass>(new myClass()));
vec.push_back(std::unique_ptr<myClass>(new myClass()));
vec.push_back(std::unique_ptr<myClass>(new myClass()));
问题在于运行时,
myInstance
需要指向
myClass
的不同实例

我知道我可以使用
std::shared_ptr
,但我想保持它们
std::unique_ptr
,因此如果添加了已初始化的内容,则所有权将转移到
vec

如何保留指向
std::unique\u ptr的指针?


此外,在这里使用原始指针会被认为是不好的做法吗?指针不需要管理任何资源,但我不希望我的代码变得混乱。

您文章中的注释表明,在“非拥有”容量中使用原始指针应该是可以的。我倾向于同意这种普遍看法,但你的情况需要进一步审查

对于您的情况,您不应该使用“指向std::unique\u ptr的指针”。问题是,当您(或维护程序员)添加到向量时,向量可能会重新分配。如果确实如此,则指针将无效,不能使用

一种选择是将索引用于向量,而不是指针。如果删除或重新排列向量中的条目,则会出现中断的问题


另一个更健壮的选项是使用指向实际myClass对象的指针,而不是拥有它的唯一\u ptr。通过使用对象的唯一向量而不是更常见的对象向量来启用此选项。

原始指针的缺点是管理内存。如果你不这么做,就按照他们的名字来使用吧!谢谢有时候,我会被“良好实践”所困扰,以至于事情变得非常复杂。我想,对于一个唯一的ptr,有一些等价于弱ptr的东西可能会很好,这样,如果唯一的ptr被删除,相应的弱ptr就会失效。我想这还没有实现,因为它会使独特的_ptr变得不那么轻量级。如果有一个非共享的ptr可能会更好,它与共享的ptr基本相同,但不允许复制。为什么你需要一个指针数组?这是一个虚拟类吗?@Rabenholz:如果出于性能原因,您不想复制
myClass
的实例,那么您的第一个努力应该是使该类有效地可移动。如果你做不到这一点,智能指针是下一个最好的。
std::unique_ptr<myClass>& myInstance;