C++ 如何使智能指针指向对象的副本
如何创建不指向原始对象而是指向对象副本的智能指针C++ 如何使智能指针指向对象的副本,c++,opencv,pointers,memory-management,smart-pointers,C++,Opencv,Pointers,Memory Management,Smart Pointers,如何创建不指向原始对象而是指向对象副本的智能指针 std::unique_ptr<cv::Mat> mat_p; if(isChangePersistent){ // Use a pointer on the original object mat_p = std::make_unique<cv::Mat>(&_img); }else{ // Use a pointer on a copy of the original object
std::unique_ptr<cv::Mat> mat_p;
if(isChangePersistent){
// Use a pointer on the original object
mat_p = std::make_unique<cv::Mat>(&_img);
}else{
// Use a pointer on a copy of the original object
mat_p = std::make_unique<cv::Mat>(&(_img.clone()));
}
现在我得到了这个错误,已经是第一个std::make_shared
:
error: no matching function for call to ‘cv::Mat::Mat(cv::Mat*)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
错误:调用“cv::Mat::Mat(cv::Mat*)”时没有匹配的函数
{::新建((void*)uu p)u向上(std::转发(u参数));}
我不再真正理解这个问题。使用:
shared\u ptr
类型的对象能够拥有
一个指针,并共享该所有权:一旦他们获得所有权
指针的所有者组将负责在
最后一个释放了所有权
使用一个:
shared\u ptr
类型的对象能够拥有
一个指针,并共享该所有权:一旦他们获得所有权
指针的所有者组将负责在
最后一个释放了所有权
如果出于某种原因必须使用
unique\u ptr
,则应使用类的。否则,共享\u ptr
也可以工作
C++11
如果您创建了cv::Mat,那么请确保为其定义了适当的复制构造函数,否则
cv::Mat(_img)
将抛出与问题的以下部分相同的错误。如果出于某种原因必须使用unique\u ptr
,那么您应该使用类的。否则,共享\u ptr
也可以工作
C++11
如果您创建了cv::Mat,那么请确保为其定义了适当的复制构造函数,否则
cv::Mat(_img)
将抛出与问题的以下部分相同的错误。智能指针,无论是std::unique_ptr
还是std::shared_ptr
,都与建立对象的生存期有关。如果对象的生命周期已经在其他地方管理,则不希望更改其管理方式
在您的情况下,最简单的解决方案可能是使用哑指针,让生存期问题完全独立
std::unique_ptr<cv::Mat> mat_copy; // not initialized unless needed
cv::Mat * mat_p;
if(isChangePersistent){
// Use a pointer on the original object
mat_p = &_img;
}else{
// Use a pointer on a copy of the original object
mat_copy = new cv::Mat(_img.clone());
mat_p = mat_copy.get();
}
std::唯一的材料副本;//除非需要,否则不初始化
cv::Mat*Mat_p;
if(isChangePersistent){
//在原始对象上使用指针
材料p=&img;
}否则{
//在原始对象的副本上使用指针
mat_copy=new cv::mat(_img.clone());
mat_p=mat_copy.get();
}
智能指针,无论是std::unique_ptr
还是std::shared_ptr
,都是关于建立对象的生存期的。如果对象的生命周期已经在其他地方管理,则不希望更改其管理方式
在您的情况下,最简单的解决方案可能是使用哑指针,让生存期问题完全独立
std::unique_ptr<cv::Mat> mat_copy; // not initialized unless needed
cv::Mat * mat_p;
if(isChangePersistent){
// Use a pointer on the original object
mat_p = &_img;
}else{
// Use a pointer on a copy of the original object
mat_copy = new cv::Mat(_img.clone());
mat_p = mat_copy.get();
}
std::唯一的材料副本;//除非需要,否则不初始化
cv::Mat*Mat_p;
if(isChangePersistent){
//在原始对象上使用指针
材料p=&img;
}否则{
//在原始对象的副本上使用指针
mat_copy=new cv::mat(_img.clone());
mat_p=mat_copy.get();
}
cv::Mat
已经是引用计数对象。它本质上类似于共享\u ptr
您根本不需要将其保存在外部共享\u ptr
、唯一\u ptr
或任何其他智能指针包装器中
按原样使用即可。
如果您有cv::Mat img1、img2
,则:
img2=img1代码>将使两个变量共享相同的图像(更改一个变量将更改另一个变量)李>
img2=im1.clone()代码>将提供img2
一份独立的img1
cv::Mat
已经是引用计数对象。它本质上类似于共享\u ptr
您根本不需要将其保存在外部共享\u ptr
、唯一\u ptr
或任何其他智能指针包装器中
按原样使用即可。
如果您有cv::Mat img1、img2
,则:
img2=img1代码>将使两个变量共享相同的图像(更改一个变量将更改另一个变量)李>
img2=im1.clone()代码>将提供img2
一份独立的img1
两个std::make_unique
语句是否都显示错误?什么是clone()
?仅显示第二个std::make_unique
。我应该补充一点,\u img
是定义此方法的类的成员变量。由于必须使用克隆
函数而不是复制构造函数,这变得更加困难。@Jonas我只是说更难,并不是说你没有很好的理由这么做。注意:从您没有新分配的现有对象生成一个唯一的\u ptr
不会有好的结果。两个std::make\u unique
语句是否都显示了错误?什么是clone()
?仅第二个std::make\u unique
。我应该补充一点,\u img
是定义此方法的类的成员变量。由于必须使用克隆
函数而不是复制构造函数,这变得更加困难。@Jonas我只是说更难,并不是说你没有很好的理由这么做。另外,从一个你没有新分配的现有对象创建一个唯一的\u ptr
,不会有好的结果。
std::shared_ptr<cv::Mat> mat_p;
if (isChangePersistent) {
// Use a pointer on the original object
mat_p = std::make_shared<cv::Mat>(&_img);
} else {
// Create a new shared pointer that holds a copy of _img on the heap
mat_p = std::make_shared<cv::Mat>(cv::Mat(_img));
}
std::unique_ptr<cv::Mat> mat_copy; // not initialized unless needed
cv::Mat * mat_p;
if(isChangePersistent){
// Use a pointer on the original object
mat_p = &_img;
}else{
// Use a pointer on a copy of the original object
mat_copy = new cv::Mat(_img.clone());
mat_p = mat_copy.get();
}