簡體   English   中英

一個具有向量數據成員的類

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM