任意类型的malloc

时间:2015-02-03 16:02:14

标签: c++ malloc

假设我有一个类型MyType,其构造函数将std::string作为参数(不是默认构造)。

我希望再打电话,

MyType* arr = (MyType*) malloc(N * sizeof(MyType));

然后使用指针算法来做类似的事情,

std::string str("pi");
*(arr + 31415926) = std::move(MyType(str));

这是触发segfault,我的理解是malloc内存中没有构造对象,并且std::move分配是在不存在的情况下调用的对象

如何最有效地将对象移动到数组中,我需要做些什么?我宁愿不诉诸std::vector<MyType>std::vector<MyType>::reserve()

a)因为不同的部分将被不同的std::thread s读取/写入

b)我想了解动态内存管理。

我感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

不考虑malloc / freenew char[] / delete[]的问题,您可以使用展示位置在未初始化的存储空间中构建数组。语法是

new(address) classname(parameters);

在你的情况下:

// Mighty big "array" you have there...
new(arr + 31415926) MyType(std::move(some_existing_mytype_object));

请注意,您必须手动调用构造函数(而不是使用delete),如

arr[31415926].~MyType();

以后摧毁它。 请注意,执行此类操作需要非常小心,尤其是异常安全性,并且您可能不应该这样做。 std::vector在内部执行此操作,因此您不必。

答案 1 :(得分:2)

你是对的 - malloc不调用构造函数(并且free稍后不会调用析构函数),所以你必须手动调用它或者在分配的内存上使用placement new(不要忘记在释放内存之前调用析构函数)。 如果可以的话,我应该使用newdelete