C++ 为什么我在这里泄漏内存(深度优先搜索)c++;? int-Solver::negamax(位置*pos,int-alpha,int-beta,int-color,int-depth){ 如果(深度==0 | |为最终值(位置)){ 退货评估(pos); } 否则{ 向量moves=生成移动(pos->get_board()); 向量::迭代器移动; int-min=99999; 对于(move=moves.begin();move获取数据()>=3){ TakeAwayBoard*b=新的TakeAwayBoard(board->get_data()-3); 位置*p=新位置(b); 移动。推回(p); } 如果(线路板->获取数据()>=2){ 外卖板*b=新外卖板(板->获取数据()-2); 位置*p=新位置(b); 移动。推回(p); } 外卖板*b=新外卖板(板->获取数据()-1); 位置*p=新位置(b); 移动。推回(p); 回击动作;
}C++ 为什么我在这里泄漏内存(深度优先搜索)c++;? int-Solver::negamax(位置*pos,int-alpha,int-beta,int-color,int-depth){ 如果(深度==0 | |为最终值(位置)){ 退货评估(pos); } 否则{ 向量moves=生成移动(pos->get_board()); 向量::迭代器移动; int-min=99999; 对于(move=moves.begin();move获取数据()>=3){ TakeAwayBoard*b=新的TakeAwayBoard(board->get_data()-3); 位置*p=新位置(b); 移动。推回(p); } 如果(线路板->获取数据()>=2){ 外卖板*b=新外卖板(板->获取数据()-2); 位置*p=新位置(b); 移动。推回(p); } 外卖板*b=新外卖板(板->获取数据()-1); 位置*p=新位置(b); 移动。推回(p); 回击动作;,c++,memory,pointers,memory-leaks,depth-first-search,C++,Memory,Pointers,Memory Leaks,Depth First Search,} 我修改了我的程序,很明显我正在泄漏内存。看起来我正在删除所有未使用的对象,但可能我不了解一些东西。generate_moves()是否为每个被推入的对象分配内存。Evaluate返回1。是否有可能在任何位置泄漏内存?在我看来,您从未清除“最小”位置 您将指向电路板的指针存储在best中,当您用更好的最小值替换它时,请注意清除该指针,如果移动到目前为止不是最小值,请正确清理它,但如果实际位置指针是最小值,则永远不会清理它 作为旁注,这是多余的: int Solver::negamax(Posi
我修改了我的程序,很明显我正在泄漏内存。看起来我正在删除所有未使用的对象,但可能我不了解一些东西。generate_moves()是否为每个被推入的对象分配内存。Evaluate返回1。是否有可能在任何位置泄漏内存?在我看来,您从未清除“最小”位置 您将指向电路板的指针存储在
best
中,当您用更好的最小值替换它时,请注意清除该指针,如果移动到目前为止不是最小值,请正确清理它,但如果实际位置指针是最小值,则永远不会清理它
作为旁注,这是多余的:
int Solver::negamax(Position* pos,int alpha,int beta, int color, int depth ) {
if(depth==0 || is_final(pos)){
return evaluate(pos);
}
else{
vector < Position* > moves = generate_moves(pos->get_board());
vector < Position* >::iterator move;
int min = 99999;
for(move = moves.begin(); move < moves.end(); move++){
int val = negamax(*move,alpha, beta, -color, depth - 1 );
if(val <= min){
min = val;
delete best;
best = NULL;
best = (*move)->get_board();
}
else{
delete *move; //So this isnt cleaning up?
*move = NULL;
}
}
min = -min;
return min;
}
}
vector < Position* > TakeAwaySolver::generate_moves(Board *brd){
TakeAwayBoard *board = static_cast<TakeAwayBoard*>(brd);
vector < Position* > moves;
if(board->get_data() >= 3){
TakeAwayBoard *b = new TakeAwayBoard(board->get_data() - 3);
Position* p = new Position(b);
moves.push_back(p);
}
if(board->get_data() >= 2){
TakeAwayBoard *b = new TakeAwayBoard(board->get_data() - 2);
Position* p = new Position(b);
moves.push_back(p);
}
TakeAwayBoard *b = new TakeAwayBoard(board->get_data() - 1);
Position* p = new Position(b);
moves.push_back(p);
return moves;
在我看来,你永远不会清除“最低”位置 您将指向电路板的指针存储在
best
中,当您用更好的最小值替换它时,请注意清除该指针,如果移动到目前为止不是最小值,请正确清理它,但如果实际位置指针是最小值,则永远不会清理它
作为旁注,这是多余的:
int Solver::negamax(Position* pos,int alpha,int beta, int color, int depth ) {
if(depth==0 || is_final(pos)){
return evaluate(pos);
}
else{
vector < Position* > moves = generate_moves(pos->get_board());
vector < Position* >::iterator move;
int min = 99999;
for(move = moves.begin(); move < moves.end(); move++){
int val = negamax(*move,alpha, beta, -color, depth - 1 );
if(val <= min){
min = val;
delete best;
best = NULL;
best = (*move)->get_board();
}
else{
delete *move; //So this isnt cleaning up?
*move = NULL;
}
}
min = -min;
return min;
}
}
vector < Position* > TakeAwaySolver::generate_moves(Board *brd){
TakeAwayBoard *board = static_cast<TakeAwayBoard*>(brd);
vector < Position* > moves;
if(board->get_data() >= 3){
TakeAwayBoard *b = new TakeAwayBoard(board->get_data() - 3);
Position* p = new Position(b);
moves.push_back(p);
}
if(board->get_data() >= 2){
TakeAwayBoard *b = new TakeAwayBoard(board->get_data() - 2);
Position* p = new Position(b);
moves.push_back(p);
}
TakeAwayBoard *b = new TakeAwayBoard(board->get_data() - 1);
Position* p = new Position(b);
moves.push_back(p);
return moves;
您有一个if/else,其中*move只在其中一个路径中被删除。我会在那里检查
best = NULL;
best = (*move)->get_board();
for(move=moves.begin();move
您有一个if/else,其中*move只在其中一个路径中被删除。我会在那里检查
best = NULL;
best = (*move)->get_board();
for(move=moves.begin();move
Astd::vector
容器在销毁时不会自动删除插入的元素。将其设置为std::vector
,其中x是一些合适的智能指针模板,如auto\u ptr
如果您不想这样做,那么下一个最好的方法是将该向量包装到一个类中,该类的析构函数迭代该向量,并在每个指针上调用delete
即,这是内存泄漏:
for(move = moves.begin(); move < moves.end(); move++){
int val = negamax(*move,alpha, beta, -color, depth - 1 );
if(val <= min){
min = val;
delete best;
best = NULL;
best = (*move)->get_board();
//best is deleted, but *move is not
}
else{
delete *move;
*move = NULL;
}
}
{
std::vec;
向量推回(新整数[3]);
//vec超出范围
}
当然,向量会自己清理!它会删除它的内部数组,等等。但是它不会对newint[3]执行任何操作
我们分配并放入向量。一个std::vector
容器在销毁时不会自动删除插入的元素。将其设为std::vector
,其中x是一些合适的智能指针模板,如auto\u ptr
如果您不想这样做,那么下一个最好的方法是将该向量包装到一个类中,该类的析构函数迭代该向量,并在每个指针上调用delete
即,这是内存泄漏:
for(move = moves.begin(); move < moves.end(); move++){
int val = negamax(*move,alpha, beta, -color, depth - 1 );
if(val <= min){
min = val;
delete best;
best = NULL;
best = (*move)->get_board();
//best is deleted, but *move is not
}
else{
delete *move;
*move = NULL;
}
}
{
std::vec;
向量推回(新整数[3]);
//vec超出范围
}
当然,向量会自己清理!它会删除它的内部数组,等等。但是它不会对
newint[3]执行任何操作我们分配和放入向量。V/GP在哪里告诉你内存丢失?你在泄露,因为你在使用<代码>新< /C> >和代码>删除< /C>。你不需要在C++中使用<代码>删除>代码>,只需要在非常具体的情况下使用<代码>新< /C> >,这不适用于你的例子。使用和使用标准容器。TakeAwayBoard*b=新的TakeAwayBoard(…)
?您是否在某个地方释放*b
,例如在位置::~Position()
?我想我们需要更多的代码(以及准确/完整的valgrind错误报告)@avakar什么?如果你需要使用new
,无论情况多么具体,你也需要使用delete
。@MrLister:如果你使用new
,那么必须使用delete
,但这应该是某种资源管理对象,而不是你。当然,除非你喜欢调试内存泄漏Valgnand告诉你内存丢失了吗?因为你在使用<代码>新< /代码>和<代码>删除<代码>。你不需要在C++中使用<代码>删除>代码>,只需要在非常具体的环境下使用<代码>新的<代码>。这不适用于你的例子。AwayBoard*b=新的外卖板(…)
?你有空吗