我正在尝试通过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
任何帮助将不胜感激。谢谢
memcpy(data, &float_vec, VEC_SZ);
这不起作用,memcpy
只能与普通复制类型一起使用,而std::vector
则不能。
您可能想要的是:
memcpy(data, float_vec.data(), VEC_SZ);
向量是一个“对象”,它持有指向动态分配的实际存储元素的内存的指针。因此,如果获取矢量对象本身的地址,则不是在访问其元素,而是访问矢量对象之外的内容。
要访问向量实际存储元素的内存,请使用其成员函数data()
。因此,以下命令可以完成此工作:
memcpy(data, float_vec.data(), VEC_SZ);
向量不可复制。在它们上使用memcpy
具有未指定的行为,可能未定义。不要这样另外,也不需要在C ++中使用malloc
。
要复制向量,这是一种有效的解决方案:
std::vector<float> k = float_vec;