【发布时间】:2020-06-03 11:13:12
【问题描述】:
我正在尝试通过 memcpy 将浮点向量复制到 void* 变量中。如果向量大小小于 3000,则下面的代码可以正常工作。但是当尝试复制大小大于 3000 的向量时,我遇到了分段错误。
void* process(std::string datatype) {
// given datatype will decide the dataype of vec.
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);
}
return data;
}
int main() {
VEC_COUNT = 10; //will be same as in upper method
void* data = process("float");
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] = "
<< k[i] << std::endl;
}
在 memcpy 之前,我使用 malloc 来分配内存。 malloc 没有给出任何类型的分段错误,但 memcpy 不能正常工作。 当我使用 gdb 和回溯分段错误运行此代码时,出现以下错误
__memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:249
任何帮助将不胜感激。谢谢
【问题讨论】:
-
这似乎是XY problem。请说明您真正想要实现的目标。
-
在
void* data = process("float")、data指向未知 大小的浮点值之后,您至少需要第二个参数,该参数将包含data指向的值的数量. -
是的,我知道我需要这些信息。现在我正在尝试不同的东西,这就是为什么在“过程”方法和外部世界中硬编码大小的原因。\
-
@Hasnain 您不能将
float元素的动态数组转换为向量。那是不可能的。要么将其用作数组 (data[i]),要么创建一个新向量并将数组中的元素复制到其中。顺便说一句,编辑后,代码将无法编译。float_vec在main中不存在。 -
@Hasnain 即使在编辑之后,也不清楚为什么需要一个普通的动态数组。为什么不简单地从
process函数返回向量?
标签: c++ memory memory-management