一个带有矢量数据成员的类

时间:2014-03-24 07:05:25

标签: c++ new-operator

我想用矢量数据成员定义一个类。该课程如下所示

class A{
...
private:
     std::vector<int> v1;
...
};

如果我使用operator new为A类分配内存,程序就可以了。但是,如果我从预先分配的内存中获取内存并将指针强制转换为类型A *,程序将崩溃。

A* a = new A;
A* b = (A*)pre_allocated_memory_pointer.

我需要一个可变大小的向量,并希望从一个预先分配的内存中获取A的内存。你对这个问题有什么看法吗?

3 个答案:

答案 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实例,但我怀疑这是您想要的。

在我看来,你想要一个自定义的向量分配器,它可以从预分配的内存池中获取向量的数据。