我想定义一个具有向量数据成员的类。这门课看上去如下
class A{
...
private:
std::vector<int> v1;
...
};如果我使用新运算符为A类分配内存,则程序是可以的。但是,如果我从预先分配的内存中获得内存,并将指针转换为A*类型,程序就会崩溃。
A* a = new A;
A* b = (A*)pre_allocated_memory_pointer.我需要一个可变大小的向量,并希望从一个预先分配的内存中获得A的内存。你对这个问题有什么想法吗?
发布于 2014-03-24 07:15:57
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 ...
}
};另一个选项是指定使用新位置分配对象的位置:
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“分配器”。
发布于 2014-03-24 07:18:43
仅仅将预先分配的内存点转换为用户定义的类型是不够的,除非这个UDT是“琐碎的”。
相反,您可能希望使用安置新表达式在提供的内存区域实际调用您类型的构造函数:
A* b = new(pre_allocated_memory_pointer) A();当然,您需要确保您的内存是正确对齐的,并且能够适应整个对象(即它的大小是>= size Of (A))。
也不要忘记在去分配底层内存之前显式地调用这个对象的析构函数。
b.~A();
deallocate(pre_allocated_memory_pointer);发布于 2014-03-24 07:17:34
正如我理解您的问题一样,您混淆了std::vector的数据内存和它作为成员占用的内存。
如果您将pre_allocated_memory_pointer转换为A*,则没有调用构造函数,并且有一个无效的对象。这意味着v1成员不会被构造,因此没有为向量分配内存。
您可以使用placement来在A位置构造pre_allocated_memory_pointer实例,但我怀疑这是您想要的。
在我看来,您需要一个用于向量的自定义分配器,它从预先分配的内存池中获取向量数据的内存。
https://stackoverflow.com/questions/22602973
复制相似问题