如何制作指针的副本

时间:2012-02-05 12:38:11

标签: c++ c

我正在尝试将指针数据复制到另一个指针,因此如果我更改一个指针,则另一个指针中的值不会改变。

我需要这个,因为我正在编写一个循环,我有两个struct指针,value和lastValue。在循环的每次迭代中,我将value的内容分配给lastValue,然后使用新内容填充value。问题是因为两者都是结构指针,当我更改value时,lastValue也会发生变化,而这不是我想要的行为。代码将是这样的(结构是来自OpenCV的IplImages):

IplImage *value;
Iplimage *lastValue;
while(1)
{
   lastValue=value;
   value=cvQueryFrame( capture );//This fills the struct with new information
}

如果它们在普通结构中,但由于它们是指针,它们最终都具有相同的值。有没有办法获得一个指针的副本,具有相同的值,但地址不同?

3 个答案:

答案 0 :(得分:2)

    value=cvQueryFrame( capture );
     

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

不,它没有。指针value会被覆盖,如您所愿。这行代码不可能影响lastValue

  

但是因为它们是指针,所以两者都以相同的值

结束

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


然而cvQueryFrame会返回指向缓冲区的指针you shall not modify or free,因为这样做了:

  

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

尽管the documentation有点不清楚,但我觉得缓冲区只有在下一次调用cvQueryFrame之后才会有效(然后会重新使用已分配的内存)。因此即使lastValue不能也不会发生变化,发生最终会指向新的框架。

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

lastValue = cvCloneImage(value);

现在你可能会承担释放它的责任(但是我粗略地看一眼文档并不完全清楚):

cvReleaseImage(&lastValue);

答案 1 :(得分:1)

函数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); 
} 
//...

答案 2 :(得分:0)

看起来你正在做正确的事。

last_value = value;  //copy pointer

但它并不是你想要的,因为它不是你要复制的指针,它是里面的数据。这就是旧指针与新指针一起更新的原因。我认为你需要的是结构本身的副本。

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

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