C++ 如何制作指针的副本

C++ 如何制作指针的副本,c++,c,C++,C,我试图将一个指针数据复制到另一个指针,这样如果我更改一个指针,另一个指针中的值就不会更改 我需要这个,因为我正在编写一个循环,其中有两个结构指针value和lastValue。在循环的每次迭代中,我将value的内容分配给lastValue,并用新内容填充value。问题是,因为两者都是结构指针,所以当我更改value时,lastValue也会更改,而这不是我想要的行为。代码如下(结构是OpenCV中的IplImages): 如果它们都是普通结构,但由于它们是指针,因此最终都具有相同的值,那么这

我试图将一个指针数据复制到另一个指针,这样如果我更改一个指针,另一个指针中的值就不会更改

我需要这个,因为我正在编写一个循环,其中有两个结构指针value和lastValue。在循环的每次迭代中,我将
value
的内容分配给
lastValue
,并用新内容填充
value
。问题是,因为两者都是结构指针,所以当我更改
value
时,
lastValue
也会更改,而这不是我想要的行为。代码如下(结构是OpenCV中的
IplImages
):

如果它们都是普通结构,但由于它们是指针,因此最终都具有相同的值,那么这将起作用。有没有一种方法可以获得指针的副本,具有相同的值,但地址不同

当我更改值时,lastValue也会更改

不,没有。指针
会根据需要被覆盖。这行代码不可能影响
lastValue

但因为它们是指针,所以最终都会得到相同的值

不,它们是指针并不重要。指针本身仍然是对象


但是
cvQueryFrame
返回指向缓冲区的指针,在执行此操作时:

请注意,设备捕获的图像由捕获功能分配/释放。没有必要明确地发布它

虽然有点不清楚,但在我看来,缓冲区只有在下一次调用
cvQueryFrame
(然后将重新使用分配的内存)之前才有效。因此,即使
lastValue
不能也不改变,它最终还是指向了新的帧

要解决此问题,可以显式复制
lastValue
指向的对象:

lastValue = cvCloneImage(value);
现在,您可能要承担释放它的责任(但从我粗略浏览文档的情况来看,仍然不完全清楚):


看来你做的是对的

last_value = value;  //copy pointer
但它并不是你真正想要的,因为它不是你想要复制的指针,而是里面的数据。这就是旧指针随新指针一起更新的原因。我想你需要的是结构本身的副本

如果指针指向您编写的某个类,请向其添加复制构造函数方法,然后复制指针的值,如下所示:

last_value = new MyClass(*value); //construct object, copy from what value points to
//change value

函数
cvQueryFrame
从相机或视频文件中获取帧,解压缩并返回。它返回指向具有最后抓取帧的内部OpenCV缓冲区的指针。这应该是你得到相同值的原因。如果需要2帧,则应创建图像的副本

IplImage * previousFrame, *currentFrame ;
CvCapture* video = cvCaptureFromAVI("video.avi");   
currentFrame = cvQueryFrame( video );

 // COPY IMAGE
previousFrame  = cvCloneImage( currentFrame );

while(currentFrame = cvQueryFrame( video ))
{
   //...
   cvCopy( currentFrame , previousFrame); 
} 
//...

Cv::Mat
提供了
clone()
方法旧指针根本没有“更新”。他不是这个班的老板。否则是正确的。哦,好吧,我认为lastValue也发生了变化,因为如果我在循环结束时检查它,lastValue==value将解析为true。我仍然是OpenCV的初学者,我还没有完全理解为什么lastvalue最终会得到相同的值,但我将使用cvCloneImage()来解决这个问题。多谢各位much@user1190588:然后碰巧,通过设计
cvQueryFrame
,视频帧使用了相同的内存区域。:)
lastValue
不会更改,但不需要更改,因为它指向的位置恰好也是新帧数据的相同位置。谢谢,我现在理解了。cvCloneImage工作正常,但是如果使用cvreleasemage(&lastValue),程序会崩溃,因此不需要手动释放图像
last_value = value;  //copy pointer
last_value = new MyClass(*value); //construct object, copy from what value points to
//change value
IplImage * previousFrame, *currentFrame ;
CvCapture* video = cvCaptureFromAVI("video.avi");   
currentFrame = cvQueryFrame( video );

 // COPY IMAGE
previousFrame  = cvCloneImage( currentFrame );

while(currentFrame = cvQueryFrame( video ))
{
   //...
   cvCopy( currentFrame , previousFrame); 
} 
//...