首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个具有向量数据成员的类

一个具有向量数据成员的类
EN

Stack Overflow用户
提问于 2014-03-24 07:05:24
回答 3查看 402关注 0票数 0

我想定义一个具有向量数据成员的类。这门课看上去如下

代码语言:javascript
复制
class A{
...
private:
     std::vector<int> v1;
...
};

如果我使用新运算符为A类分配内存,则程序是可以的。但是,如果我从预先分配的内存中获得内存,并将指针转换为A*类型,程序就会崩溃。

代码语言:javascript
复制
A* a = new A;
A* b = (A*)pre_allocated_memory_pointer.

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-24 07:15:57

std::vector是一个需要初始化的对象,您不能只分配内存并假装您有一个vector

如果需要控制从解决方案中获取内存的位置,则需要为类定义operator::new

代码语言:javascript
复制
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 ...
    }
};

另一个选项是指定使用新位置分配对象的位置:

代码语言:javascript
复制
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“分配器”。

票数 3
EN

Stack Overflow用户

发布于 2014-03-24 07:18:43

仅仅将预先分配的内存点转换为用户定义的类型是不够的,除非这个UDT是“琐碎的”。

相反,您可能希望使用安置新表达式在提供的内存区域实际调用您类型的构造函数:

代码语言:javascript
复制
A* b = new(pre_allocated_memory_pointer) A();

当然,您需要确保您的内存是正确对齐的,并且能够适应整个对象(即它的大小是>= size Of (A))。

也不要忘记在去分配底层内存之前显式地调用这个对象的析构函数。

代码语言:javascript
复制
b.~A();
deallocate(pre_allocated_memory_pointer);
票数 3
EN

Stack Overflow用户

发布于 2014-03-24 07:17:34

正如我理解您的问题一样,您混淆了std::vector的数据内存和它作为成员占用的内存。

如果您将pre_allocated_memory_pointer转换为A*,则没有调用构造函数,并且有一个无效的对象。这意味着v1成员不会被构造,因此没有为向量分配内存。

您可以使用placement来在A位置构造pre_allocated_memory_pointer实例,但我怀疑这是您想要的。

在我看来,您需要一个用于向量的自定义分配器,它从预先分配的内存池中获取向量数据的内存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22602973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档