[英]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.