在我的C ++程序中,我有一个对象向量。该向量中的某些对象将具有一个成员变量,其值为零。示例:
struct MyObject{
float a;
float b;
int c;
};
std::vector<MyObject> all_objects;
// Fill all_objects with various elements, some of which will have an `a` value equal to 0.
现在我正在尝试复制到另一个向量仅a
值不为零的元素>:
std::vector<MyObject> non_zero_objects(all_objects.size()); // Ensure we allocate enough memory int non_zero_cnt = 0; for (int i = 0; i < all_objects.size(); ++i) { if (all_objects[i].a != 0.0) { // If the value of a is non-zero // Copy exactly one MyObject from the source location to the destination std::memcopy(non_zero_objects.data() + (non_zero_cnt * sizeof(MyObject)), // Destination all_objects.data() + i, // Source sizeof(MyObject)) non_zero_cnt++; } }
这一切都很好。
但是,我观察到的是,过一会儿,我的non_zero_objects
向量的前几个元素被重置为其默认构造值(a = 0,b = 0,c = 0)!
示例:
all_objects = {MyObj(3,3,1), MyObj(2,3,2), MyObj(0,0,0),..., MyObj(1,4,5)} non_zero_objects = {MyObj(0,0,0), ..., MyObj(0,0,0)} Loop Iteration 1: non_zero_objects = {MyObj(3,3,1), ..., MyObj(0,0,0)} Loop Iteration 2: non_zero_objects = {MyObj(3,3,1), MyObj(2,3,2), ...,MyObj(0,0,0)} ... Some future iteration: non_zero_objects = {MyObj(0,0,0), MyObj(2,3,2), ...,MyObj(0,0,0)} // The first object suddenly has default constructed values! ... Even later iteration non_zero_objects = {MyObj(0,0,0), MyObj(0,0,0), ...,MyObj(1,4,5)} // Now also the second object has default constructed values!
我不知道这是怎么回事。我为
non_zero_objects
分配了足够的内存,并且如果向量开头的内存被程序的其他部分覆盖,我应该得到混杂的值,而不是具有0值的默认构造对象,对吗?
行为是一致的,因为它总是在同一循环迭代中发生。
[我将注意到,此过程在2个MPI启动的过程中同时发生,但是每个都有自己的内存空间(对吗?),所以其中一个不可能影响另一个的内存。] >
使用valgrind运行也不会显示任何非法/越界写入。我什至还为每个向量元素打印出了内存的位置,并且在每次迭代之间都没有改变。
在我的C ++程序中,我有一个对象向量。该向量中的某些对象将具有一个成员变量,其值为零。示例:struct MyObject {float a;浮动b; int c; }; std :: vector&...
以上答案中已经给出了所有答案。因此,这是一个摘要,所有功劳归于以上评论者。
首先,您的代码有错误。它甚至无法编译。