矢量元素被重置为默认值

问题描述 投票:0回答:1

在我的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&...

c++ memory vector memcpy
1个回答
0
投票

以上答案中已经给出了所有答案。因此,这是一个摘要,所有功劳归于以上评论者。

首先,您的代码有错误。它甚至无法编译。

© www.soinside.com 2019 - 2024. All rights reserved.