[尝试通过memcpy复制大尺寸的浮点向量时出现分段错误

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

我正在尝试通过memcpy将浮点向量复制到void *变量中。如果向量大小小于3000,则下面的代码可以正常工作。但是,当尝试复制大小大于3000的向量时,出现了分割错误。

  const uint64_t VEC_COUNT = 10; // vector size
  const uint64_t VEC_SZ = VEC_COUNT * sizeof(float);
  std::vector<float> float_vec;
  float_vec.reserve(VEC_COUNT);
  for (unsigned int i = 0; i < VEC_COUNT; ++i) {
    float val = (float)(rand() % 100) / 3.0f;
    float_vec.push_back(val);
  }

  void* data = nullptr;
  data = malloc(VEC_SZ);
  if (data == nullptr) {
    throw std::invalid_argument("Could not allocate memory for data!");
  }
  memcpy(data, &float_vec, VEC_SZ);
  std::vector<float> &k =
    *(static_cast<std::vector<float>*>(data));
  for (unsigned int i = 0; i < VEC_COUNT; ++i) {
    std::cout << "k[i] = " << k[i] << " , float_vec[i] = "
      << float_vec[i] << std::endl;
  }

在使用memcpy之前,我正在使用malloc分配内存。 malloc没有给出任何类型的分段错误,但是memcpy无法正常工作。当我使用gdb和backtrace分段错误运行此代码时,出现以下错误

__memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:249

任何帮助将不胜感激。谢谢

c++ memory memory-management
3个回答
0
投票
memcpy(data, &float_vec, VEC_SZ);

这不起作用,memcpy只能与普通复制类型一起使用,而std::vector则不能。

您可能想要的是:

memcpy(data, float_vec.data(), VEC_SZ);

0
投票

向量是一个“对象”,它持有指向动态分配的实际存储元素的内存的指针。因此,如果获取矢量对象本身的地址,则不是在访问其元素,而是访问矢量对象之外的内容。

要访问向量实际存储元素的内存,请使用其成员函数data()。因此,以下命令可以完成此工作:

memcpy(data, float_vec.data(), VEC_SZ);

0
投票

向量不可复制。在它们上使用memcpy具有未指定的行为,可能未定义。不要这样另外,也不需要在C ++中使用malloc

要复制向量,这是一种有效的解决方案:

std::vector<float> k = float_vec;
© www.soinside.com 2019 - 2024. All rights reserved.