gpt4 book ai didi

c++ - 异常代码 C++ 中的泄漏

转载 作者:行者123 更新时间:2023-11-30 01:30:44 27 4
gpt4 key购买 nike

我一直在处理一个学校项目,其中一项任务是确保它完全不会泄漏。因此,我通过 valgrind 运行我的程序,因为我没有使用任何动态内存分配,所以我认为我不会找到任何东西。

糟糕,我做到了。 Valgrind 给了我这个:

==22107== 16 bytes in 1 blocks are definitely lost in loss record 1 of 4
==22107== at 0x100038915: malloc (vg_replace_malloc.c:236)
==22107== by 0x1000950CF: __cxa_get_globals (in /usr/lib/libstdc++.6.0.9.dylib)
==22107== by 0x100094DCD: __cxa_allocate_exception (in /usr/lib/libstdc++.6.0.9.dylib)
==22107== by 0x100051D42: std::__throw_out_of_range(char const*) (in /usr/lib/libstdc++.6.0.9.dylib)
==22107== by 0x100005463: std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::_M_range_check(unsigned long) const (in ./connect3)
==22107== by 0x100005482: std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >::at(unsigned long) (in ./connect3)
==22107== by 0x1000016E3: connect3::checkIfPositionIsBaseCase(Position) const (in ./connect3)
==22107== by 0x100007BD8: Game::evaluate(Position) (in ./connect3)
==22107== by 0x100007D72: Game::evaluate(Position) (in ./connect3)
==22107== by 0x1000043B4: main (in ./connect3)
==22107==
==22107== LEAK SUMMARY:
==22107== definitely lost: 16 bytes in 1 blocks
==22107== indirectly lost: 0 bytes in 0 blocks
==22107== possibly lost: 0 bytes in 0 blocks
==22107== still reachable: 8,280 bytes in 3 blocks
==22107== suppressed: 0 bytes in 0 blocks
==22107== Reachable blocks (those to which a pointer was found) are not shown.
==22107== To see them, rerun with: --leak-check=full --show-reachable=yes

好吧,我看了一下它来 self 的函数“checkIfPositionIsBaseCase(Position)”。看着这个方法(我的伙伴写的),我真的很惊讶地发现了一些可能导致泄漏的东西。

异常(exception)。这是该功能的代码。 (从头到尾几乎都是一样的东西,阅读第一个 try catch,你已经读完了所有内容)。

///
/// checkIfPositionIsBaseCase
///
bool connect3::checkIfPositionIsBaseCase(Position aPosition) const {

vector< vector< int > > thisP = aPosition.getBoard();

for( int w = 0; w < thisP.size(); w++ ) {
for( int h = 0; h < thisP.at(w).size(); h++ ){
int thisS = thisP.at( w ).at( h );
if( thisS != 0 ){
try{
if( thisP.at( w - 1 ).at( h - 1 ) == thisS ){
if( thisP.at( w - 2 ).at( h - 2 ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w ).at( h - 1 ) == thisS ){
if( thisP.at( w ).at( h - 2 ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w + 1 ).at( h - 1 ) == thisS ){
if( thisP.at( w + 2 ).at( h - 2 ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w - 1 ).at( h ) == thisS ){
if( thisP.at( w - 2 ).at( h ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w + 1 ).at( h ) == thisS ){
if( thisP.at( w + 2 ).at( h ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w - 1 ).at( h + 1 ) == thisS ){
if( thisP.at( w - 2 ).at( h + 2 ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w ).at( h + 1 ) == thisS ){
if( thisP.at( w ).at( h + 2 ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}

try{
if( thisP.at( w + 1 ).at( h + 1 ) == thisS ){
if( thisP.at( w + 2 ).at( h + 2 ) == thisS ){
return true;
}
}
}catch( out_of_range& ){}
}
}
}
///
/// One possibility
///
for (int i = 0; i < thisP.size(); i++) {
for (int j = 0; j < thisP.at(i).size(); j++) {
if (thisP.at(i).at(j) == 0) {
return false;
}
}
}
return true;
}

我做了一些阅读,看起来我正在捕获异常意味着我正在泄漏内存,但我不知道如何解决这个问题。我如何重构代码以免内存泄漏?

最佳答案

重要的是要了解重复泄漏内存(这可能导致耗尽)与让一些底层支持代码或库具有一次性初始化步骤以获取一些将在程序中使用的堆内存之间的区别运行(在这种情况下,在程序终止时释放/删除内存并不是很有用或必要,而且尝试安排它可能会很麻烦)。

在这里,__cxa_get_globals 似乎在做一次性 malloc。

简短的故事:只要确保在重复调用这些异常时不会得到多个未发布的 block (或更大的 block )....

关于c++ - 异常代码 C++ 中的泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4161401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com