gpt4 book ai didi

c++ - STL 推回 : previous values getting modified when pushing a dynamically changing array

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:12 24 4
gpt4 key购买 nike

我的 CPP 代码中的 std::vector.push_back() 有一个非常奇怪的问题。基本上,我所做的就是:

void func()
{
if(first_time_coming_here)
{
do_some_stuff();
V.push_back(Mat::zeros(3,1,CV_32FC1)); // OpenCV Mat structure
V.push_back(Mat_array_that_gets_updated_in_another_function);
}
else
{
do_other_kinds_of_stuff();
V.push_back(Mat_array_that_gets_updated_in_another_function);
}
}

假设在上一个函数中更新的数组最初是 [1,1,1],然后我第二次执行 func() 时,它已经变成了 [2,2,2]。我的输出应该是

V = [ [0,0,0], [1,1,1], [2,2,2] ]

但相反,它是

V = [ [0,0,0], [2,2,2], [2,2,2] ]

我真的很困惑这里发生了什么。唯一有意义的是,如果 V 正在存储数组的当前值而不是已经传递的值:但是一旦调用 push_back() ,元素不应该取值并将它保存在内存中,无论如何发生在带来值(value)的变量上? V 被定义为 cv::Mat 的 vector 。

编辑:这已通过清除两个函数调用之间的数组值来解决,例如:
array = Mat::zeros(1,1,CV_32FC1);
然而,我想知道为什么直接使用它不起作用。

最佳答案

你做了一件危险的事,你推送了一个对象的拷贝,而不考虑该对象内部的指针或它们指向的内存。您推送的对象具有来自原始对象的按成员分配的数据成员,因此一旦原始对象消失,您的程序就会崩溃。

解决方案是推送一个clone对象的代替:

V.push_back(Mat_array_that_gets_updated_in_another_function.clone ());

关于c++ - STL 推回 : previous values getting modified when pushing a dynamically changing array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32084834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com