任意类型的 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读取/写入

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

我感谢任何帮助。

撇开malloc/free与的问题不谈。 new char[]/delete[] ,您可以使用放置 new 在未初始化的存储中构造数组。语法是

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内部执行此操作,因此您不必这样做。

你是

对的 - malloc不调用构造函数(free以后不会调用析构函数),所以你必须手动调用它或在分配的内存上使用放置新位置(不要忘记在释放内存之前调用析构函数)。对于我之前提到的问题,您应该使用new,如果可以的话,delete

相关内容

  • 没有找到相关文章

最新更新