我正在尝试将指针数据复制到另一个指针,因此如果我更改一个指针,则另一个指针中的值不会改变。
我需要这个,因为我正在编写一个循环,我有两个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
}
如果它们在普通结构中,但由于它们是指针,它们最终都具有相同的值。有没有办法获得一个指针的副本,具有相同的值,但地址不同?
答案 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