代码之家  ›  专栏  ›  技术社区  ›  Searene

使用带有向量的boost::object_池时获取无效指针

c++
  •  2
  • Searene  · 技术社区  · 6 年前

    我试着用 boost::object_pool 创建包含向量作为其成员数据的对象。这是代码。

    #include <iostream>
    #include <vector>
    #include <boost/pool/object_pool.hpp>
    
    class A {
    public:
        std::vector<int> children;
    };
    
    int main() {
        boost::object_pool<A> p;
        A* a = p.malloc();
        std::cout << a->children.size() << std::endl;
    }
    

    结果如下。

    free(): invalid pointer
    18446720595997429822
    

    0 . 然而,正如你所看到的,这里显然出了问题。分配的指针不是有效指针,为什么?我该怎么做才能使它正确?

    1 回复  |  直到 6 年前
        1
  •  2
  •   StaceyGirl    6 年前

    您正在使用分配对象 boost::object_pool<X>::malloc 它只进行内存分配,不调用对象构造函数。你已经在打电话了 size() 对于未初始化的对象。稍后退出销毁 p 导致的实例未初始化 std::vector<int> 被摧毁(根据 documentation 所有分配的对象都将被隐式销毁)。

    你应该使用 boost::objetc_pool<X>::construct 如果您需要构造对象。替换

    A* a = p.malloc();
    

    具有

    A* a = p.construct();