我想用矢量数据成员定义一个类。该课程如下所示
class A{
...
private:
std::vector<int> v1;
...
};
如果我使用operator new为A类分配内存,程序就可以了。但是,如果我从预先分配的内存中获取内存并将指针强制转换为类型A *,程序将崩溃。
A* a = new A;
A* b = (A*)pre_allocated_memory_pointer.
我需要一个可变大小的向量,并希望从一个预先分配的内存中获取A的内存。你对这个问题有什么看法吗?
答案 0 :(得分:3)
std::vector
是一个需要初始化的对象,你不能只是分配内存并伪装成vector
。
如果您需要控制从解决方案中获取内存的位置,请为您的班级定义operator::new
。
struct MyClass {
std::vector<int> x;
... other stuff ...
void *operator new(size_t sz) {
... get somewhere sz bytes and return a pointer to them ...
}
void operator delete(void *p) {
... the memory is now free ...
}
};
另一个选择是指定使用placement new分配对象的位置:
struct MyClass {
std::vector<int> x;
... other stuff ...
};
void foo() {
void * p = ... get enough memory for sizeof(MyClass) ...
MyClass *mcp = new (p) MyClass();
... later ...
mcp->~MyClass(); // Call destructor
... the memory now can be reused ...
}
但请注意std::vector
管理所包含元素的内存,因此您需要使用stl&#34; allocators&#34;如果你想控制它所需的内存来自哪里。
答案 1 :(得分:3)
将预先分配的内存poiner强制转换为用户定义的类型是不够的,除非此UDT是&#34;琐碎的&#34;。
相反,您可能希望使用placement new表达式在提供的内存区域实际调用您的类型的构造函数:
A* b = new(pre_allocated_memory_pointer) A();
当然,您需要确保您的记忆正确对齐并且可以预先适合整个对象(即其大小为&gt; = sizeof(A))。
在取消分配底层内存之前,不要忘记显式调用此对象的析构函数。
b.~A();
deallocate(pre_allocated_memory_pointer);
答案 2 :(得分:2)
据我了解你的问题,你将std::vector
的数据内存与作为成员的内存混淆。
如果将pre_allocated_memory_pointer
转换为A*
,则没有调用构造函数,并且您的对象无效。这意味着v1
成员将不会被构造,因此没有为该向量分配内存。
您可以使用展示位置新功能在A
位置构建pre_allocated_memory_pointer
实例,但我怀疑这是您想要的。
在我看来,你想要一个自定义的向量分配器,它可以从预分配的内存池中获取向量的数据。