在通过引用传递的结构中保留向量时出现内存错误

时间:2019-04-29 16:38:01

标签: c++ vector struct reference

我正在一个结构内填充一个向量,该结构本身又在另一个结构内,从文件中获取数据,但是我遇到内存泄漏,我不知道为什么。

我也尝试过使用push_back而不是使用[]运算符进行访问,但是我遇到了同样的错误。

这是一个简化的草图。我有一个嵌套的结构,里面有一个向量向量:

struct SHAPEDATA {
    std::vector< std::vector<float> > descriptor ;
};

struct CNTDATA {
    struct SHAPEDATA shape_template ;
};

然后我有两个静态函数:

void SomeClass::initialize( CNTDATA & cnt )
{
    AnotherClass::loadTemplateFromFile( cnt )

    // Reserve other vectors in the cnt structure...
}

void AnotherClass::loadTemplateFromFile( CNTDATA & cnt )
{
    std::ifstream infile( PATH_SHAPE_TEMPLATE );
    std::string str = "";

    cnt.shape_template.descriptor.reserve( DIM_1 ) ;
    for (int i = 0 ; i<DIM_1 ; i++ )
    {
        cnt.shape_template.descriptor[i].reserve( DIM_2 ) ;
        cnt.shape_template.descriptor[i].assign( DIM_2 , 0 ) ;
    }

    for (int rr = 0 ; rr<DIM_1 ; rr++)
    {
        for (int tt = 0 ; tt<DIM_2 ; tt++)
        {
            infile >> cnt.shape_template.descriptor[rr][tt] >> str ;
        }
    ]

}

当我运行代码并将CNTDATA结构传递给initialize函数时,出现错误:

*** Error in `./my_program': free(): invalid pointer: 0x0000007f30000728 ***
Aborted (core dumped)

而且我似乎找不到原因。

感谢任何可以提供帮助的人!

编辑:

我应该强调一个事实,在调用[]运算符之前,我向向量分配了0个值,因此我不认为这是reserve()vs resize()的问题。实际上,如果我在loadTemplateFromFile()函数中一一打印元素,则可以正确读取它们。

编辑2: 甚至调整大小或分配descriptor本身也给我一个“ free()”无效的指针错误。我应该补充一点,如果我写

cnt.shape_template.descriptor.reserve( DIM_1 ) ;
    for (int i = 0 ; i<DIM_1 ; i++ )
    {
        cnt.shape_template.descriptor[i].reserve( DIM_2 ) ;
    }

直接在initialize()函数中,没有出现内存错误。

当我通过引用另一个函数再次传递结构的引用时,好像出了点问题,因为当我将loadShapeTemplate()的内容带到initialize()时,一切似乎都很好。

0 个答案:

没有答案