我正在一个结构内填充一个向量,该结构本身又在另一个结构内,从文件中获取数据,但是我遇到内存泄漏,我不知道为什么。
我也尝试过使用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()
时,一切似乎都很好。