Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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++ 如何使智能指针指向对象的副本_C++_Opencv_Pointers_Memory Management_Smart Pointers - Fatal编程技术网

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();
}