初始化(已分配)内存而不调用析构函数,复制或移动

时间:2017-08-30 11:38:38

标签: c++ memory-management

我有一个用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例外)。

此处抛出错误: enter image description here

(在我初始化的行上)

我追溯到这里: enter image description here

我真的不知道会发生什么,但我认为它与移动数据或破坏数据有关。

我可以做些什么来使上面的代码工作,并且让我在不引起异常的情况下使用SomeClass

顺便说一句,我必须使用分配的内存,所以我无法将其删除。 (我将分配的内存发送到另一个.dll,所以在分配内存时我不知道结构类型)

1 个答案:

答案 0 :(得分:1)

这样做的方法是使用placement new:

auto* MemoryBlock = VirtualAlloc(0, SizeInBytes, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
SomeStruct* NewPointer = new (MemoryBlock) SomeStruct();

// ...

NewPointer->~SomeStruct();
VirtualFree(MemoryBlock /*..*/)