我有一个用VirtualAlloc
分配的内存,我将类型转换为我创建的某个结构:
struct SomeStruct
{
uint32 SomeInt;
Class SomeClass;
};
像这样:
MemoryBlock = VirtualAlloc(0, SizeInBytes, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
SomeStruct* NewPointer = (SomeStruct*)MemoryBlock ;
所有内存都被归为零但是我有一个问题,在我创建的Class
类中,有std::unordered_map<std::string, int32>
类型的成员。
问题是,当我尝试使用NewPointer->SomeClass
时,它无法工作并抛出read access violation
异常,这是正确的,但是当我尝试这样做时:
*NewPointer = {};
要初始化结构(包括NewPointer->SomeClass
),我会收到有关移动std::unordered_map<std::string, int32>
的另一个例外(同样,read access violation
例外)。
(在我初始化的行上)
我真的不知道会发生什么,但我认为它与移动数据或破坏数据有关。
我可以做些什么来使上面的代码工作,并且让我在不引起异常的情况下使用SomeClass
?
顺便说一句,我必须使用分配的内存,所以我无法将其删除。 (我将分配的内存发送到另一个.dll,所以在分配内存时我不知道结构类型)
答案 0 :(得分:1)
这样做的方法是使用placement new:
auto* MemoryBlock = VirtualAlloc(0, SizeInBytes, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
SomeStruct* NewPointer = new (MemoryBlock) SomeStruct();
// ...
NewPointer->~SomeStruct();
VirtualFree(MemoryBlock /*..*/)