任意类型的 malloc
malloc on Arbitrary Type
假设我有一个类型 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
读取 from/written
b) 我想了解动态内存管理。
感谢任何帮助。
撇开 malloc
/free
与 new char[]
/delete[]
的问题,您可以使用 placement 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
以后不会调用析构函数),所以你必须手动调用它或在分配的内存上使用 placement new(不要在释放内存之前忘记调用析构函数)。
由于我之前提到的问题,您应该尽可能使用 new
和 delete
。
假设我有一个类型 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) 我想了解动态内存管理。
感谢任何帮助。
撇开 malloc
/free
与 new char[]
/delete[]
的问题,您可以使用 placement 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
以后不会调用析构函数),所以你必须手动调用它或在分配的内存上使用 placement new(不要在释放内存之前忘记调用析构函数)。
由于我之前提到的问题,您应该尽可能使用 new
和 delete
。