[英]One class with a vector data member
我想定义一个带有向量数据成员的类。 该类如下所示
class A{
...
private:
std::vector<int> v1;
...
};
如果我使用operator new为A类分配内存,程序就OK了。 但是,如果我从预先分配的内存中获取内存并将指针强制转换为类型 A*,则程序将崩溃。
A* a = new A;
A* b = (A*)pre_allocated_memory_pointer.
我需要一个大小可变的向量,并希望从一个预先分配的内存中获取 A 的内存。 你对这个问题有什么想法吗?
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 “分配器”。
除非此 UDT 是“微不足道的”,否则将预分配的内存指针强制转换为用户定义的类型是不够的。
相反,您可能希望使用放置 new表达式在提供的内存区域实际调用您的类型的构造函数:
A* b = new(pre_allocated_memory_pointer) A();
当然,您需要事先确保您的内存正确对齐并且可以适合整个对象(即其大小 >= sizeof(A) )。
在取消分配底层内存之前,不要忘记显式调用此对象的析构函数。
b.~A();
deallocate(pre_allocated_memory_pointer);
据我了解您的问题,您将std::vector
的数据内存与其作为成员占用的内存混淆了。
如果您将pre_allocated_memory_pointer
转换为A*
,则不会调用构造函数并且您在那里有一个无效的对象。 这意味着不会构造v1
成员,因此没有为向量分配内存。
您可以使用placement new 在pre_allocated_memory_pointer
位置构造A
实例,但我怀疑这是否是您想要的。
在我看来,您需要一个自定义的向量分配器,从预分配的内存池中获取向量数据的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.