STL push_back:在推送动态变化的数组时修改以前的值
STL push_back: previous values getting modified when pushing a dynamically changing array
我的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存储的是数组的CURRENT值,而不是已经传递的值:但一旦调用push_back((,无论引入值的变量发生了什么,元素都不应该获取该值并将其保存在内存中吗?V被定义为cv::Mat的向量。
EDIT:这已经通过清除两个函数调用之间的数组值来解决,如:
array=Mat::零(1,1,CV_32FC1(
然而,我想知道为什么直接使用它不起作用。
您做了一件危险的事情,您推送了一个对象的副本,而不考虑该对象内部的指针或指针指向的内存。您推送的对象已经从原始对象中按成员方式分配了数据成员,因此一旦原始对象消失,您的程序就会崩溃。
解决方案是推送对象的克隆:
V.push_back(Mat_array_that_gets_updated_in_another_function.clone ());
来自Mat
:的OpenCV文档
在右侧可以有数组或表达式的位置使用复制构造函数或赋值运算符(请参见下文(。如引言中所述,数组赋值是O(1(运算,因为它只复制标头并增加引用计数器。Mat::clone((方法可用于在需要时获取数组的完整(深层(副本。
您也可以在文档中看到Mat
有一个成员uchar* data
其中存储矩阵的实际数据条目。
由于您没有对数组进行深度复制,对原始数组的更改也会影响您之前放入vector
中的"副本",只要它们没有改变data
成员指向的位置。(显然他们没有。(但当你做类似array = Mat::zeros(1,1,CV_32FC1);
的事情时原来的Mat
似乎得到了一个新的data
指针(或者至少从你说不改变已经在vector
中的Mat
(。
- 为什么可以修改数组 b?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何修改代码以打印出数组 v2
- 使用指针算法修改函数中的 2D 数组
- 当使用我在一个函数、另一个函数中修改的数组时,在我的输出中得到一个奇怪的负数
- 将数组传递给递归函数,同时C++修改它
- 数组在 C++ 中不使用 static in 函数时不会修改
- C++:通过函数修改数组
- 修改字符串数组中的字符串
- 我在代码中收到一个运行时错误,该错误如何通过修改最多一个元素来查找数组是否可以变得不减少
- 我正在尝试修改一个字节数组并通过 JNI 将其从 c++ 发送到 java
- 修改排序的数组或每次对数组进行排序
- 如何修改数组,从中删除空格,然后将其存储在新数组中
- 从字符串修改char数组
- 循环赋值的多维数组:表达式必须是可修改的左值
- 尝试修改数组时出现写访问冲突
- 当我们在 C++ 中的参数中传递它们时,如何修改一些数组而不修改其他数组
- 修改函数内的多维数组
- 使用指标后数组未修改
- 从uint8_t数组修改数据非常慢