2017-08-08 96 views
0

反序列化正在工作,问题在于内存泄漏。 我已经尝试删除's'指针,但有'Targeting failure',我无法删除指针。使用boost :: archive :: binary_iarchive的内存泄漏

//Statment MySql 
sql::Statement *_stmt = this->con->createStatement(); 
sql::ResultSet *_result = _stmt->executeQuery("SELECT * FROM matches ORDER BY `match_seq_num` ASC LIMIT 1250"); 

while(_result->next()){ 
    std::istream *s = _result->getBlob("match_object"); 
    boost::archive::binary_iarchive ia(*s); 
    Match _match; 
    ia >> _match; 
    delete s; 
} 
delete _result; 
delete _stmt; 

的问题是使用boost::archive::binary_iarchive ia(*s);反序列化从MySQL传来的信息后删除的“指针。

+0

我从来没有见过这样的使用iarchive。该错误可能在您的不透明函数getBlob()中。 –

回答

1

当然你需要删除。

如果出现问题,您应该解决该问题。你的更新指向一个可能的罪魁祸首:输入档案需要参考istream,仍然可以在析构函数中访问它(事实上我认为它可能)。因此,请确保它在破坏所需资源之前已经消失:

//Statment MySql 
sql::Statement *_stmt = this->con->createStatement(); 
sql::ResultSet *_result = _stmt->executeQuery("SELECT * FROM matches ORDER BY `match_seq_num` ASC LIMIT 1250"); 

while(_result->next()){ 
    Match _match; 
    { 
     std::istream *s = _result->getBlob("match_object"); 
     { 
      boost::archive::binary_iarchive ia(*s); 
      ia >> _match; 
     } 
     delete s; 
    } 
} 
delete _result; 
delete _stmt; 
+0

哦,我错过了关于“瞄准失败”的部分。告诉我们更多关于给你'_result'的图书馆。它应该有关于如何处理资源所有权/生命周期的文档。 – sehe

+0

我对这个问题做了一些更改,使问题更加明显。从我所看到的,在使用'boost :: archive :: binary_iarchive ia(* s);' –

+0

后,某些东西继续使用's'指针我已经更新了相应的答案。 – sehe