Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法理解如何修复此内存泄漏_C++_Memory Leaks_Valgrind - Fatal编程技术网

C++ 无法理解如何修复此内存泄漏

C++ 无法理解如何修复此内存泄漏,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,我正在创建一个包含三个参数的小型解算器:小时数、当前时间和真实时间 程序本身工作正常,但内存泄漏我无法修复 代码: 在我的主页内: vector moves=sol.solve(curClock) 求解方法: std::vector<Game> Solver<Game>::solve(Game curCfg){ std::vector<Game> result; std::vector<Game> seen; std::qu

我正在创建一个包含三个参数的小型解算器:小时数、当前时间和真实时间

程序本身工作正常,但内存泄漏我无法修复

代码:

在我的主页内:

vector moves=sol.solve(curClock)

求解
方法:

std::vector<Game> Solver<Game>::solve(Game curCfg){
    std::vector<Game> result;
    std::vector<Game> seen;
    std::queue<Game> q;

    q.push(curCfg);
    seen.push_back(curCfg);

    std::vector<Game> moves;

    Game cfg = q.front();
    Game * newCfg = NULL;

    while (q.size() > 0) {

        if (q.front().isEndState()) {
            break;
        }

        cfg = q.front();
        q.pop();

        cfg.getMoves(moves);
        for (unsigned int i = 0; i < moves.size(); i++) {
            if (find(seen.begin(), seen.end(), moves[i]) == seen.end()) {
                newCfg = new Game(cfg);
                moves[i].setPrev(newCfg);
                q.push(moves[i]);
                seen.push_back(moves[i]);
            }
        }
    }

    delete newCfg;

    if(q.empty()){
        return result;
    }

    Game temp(q.front());

    while (true) {
        result.push_back(temp);
        if (temp == curCfg) {
            break;
        }
        temp = temp.prev();
    }
    reverse(result.begin(), result.end());
    return result;
}
previous
是ClockState类中的指针

根据我的理解,我需要删除
newCfg
,即使我尝试这样做,它仍然会导致内存泄漏

这是来自
valgrind--leak check=full./clock 12 10 3

==16856==
==16856== HEAP SUMMARY:
==16856==     in use at exit: 64 bytes in 4 blocks
==16856==   total heap usage: 28 allocs, 24 frees, 2,095 bytes allocated
==16856==
==16856== 64 (16 direct, 48 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==16856==    at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==16856==    by 0x8049AB1: Solver<ClockState>::solve(ClockState) (Solver.h:102)
==16856==    by 0x804964B: main (clock.cpp:106)
==16856==
==16856== LEAK SUMMARY:
==16856==    definitely lost: 16 bytes in 1 blocks
==16856==    indirectly lost: 48 bytes in 3 blocks
==16856==      possibly lost: 0 bytes in 0 blocks
==16856==    still reachable: 0 bytes in 0 blocks
==16856==         suppressed: 0 bytes in 0 blocks
==16856==
==16856== For counts of detected and suppressed errors, rerun with: -v
==16856== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 6)
deletePrev()只是说
delete-previous


非常感谢。

您在aloop中创建了新对象,但只删除了一个,这会导致内存泄漏

您需要循环每次移动,并删除
上一个
指针指向的元素指针

或者,只需创建一个
游戏
对象,并在完成后将其删除(因为您多次重复创建相同的对象)

另一种选择是,如果不想在许多其他对象之间共享对象,则可以按值复制
游戏
对象(因此不需要
新建
删除

另一种方法是使用某种智能指针(例如,从BOOST或使用C++11)

此代码:

Game * newCfg = NULL;
while (q.size() > 0) {

    if (q.front().isEndState()) {
        break;
    }

    cfg = q.front();
    q.pop();
    std::vector<Game> moves;
    cfg.getMoves(moves);
    for (int i = 0; i < moves.size(); i++) {
        if (find(seen.begin(), seen.end(), moves[i]) == seen.end()) {
            newCfg = new Game(cfg);
            moves[i].setPrev(newCfg);
            q.push(moves[i]);
            seen.push_back(moves[i]);
        }
    }
}

delete newCfg;
int* myInts = NULL;
myInts = new Int[2];
myInts = new Int[5];
delete myInts; // <-- only deletes memory for Int[5],
               // Int[2] memory is dangling in no-mans-land
Game*newCfg=NULL;
而(q.size()>0){
if(q.front().isEndState()){
打破
}
cfg=q.front();
q、 pop();
向量移动;
cfg.getMoves(moves);
对于(int i=0;i
声明一个名为newCfg的变量,该变量是指向游戏的指针。然而,在循环的开始,你会不断地更新游戏类的新实例,并将它们添加到移动容器中。您需要“删除”已添加到移动容器中的每个游戏实例

上面的代码与此代码基本相同:

Game * newCfg = NULL;
while (q.size() > 0) {

    if (q.front().isEndState()) {
        break;
    }

    cfg = q.front();
    q.pop();
    std::vector<Game> moves;
    cfg.getMoves(moves);
    for (int i = 0; i < moves.size(); i++) {
        if (find(seen.begin(), seen.end(), moves[i]) == seen.end()) {
            newCfg = new Game(cfg);
            moves[i].setPrev(newCfg);
            q.push(moves[i]);
            seen.push_back(moves[i]);
        }
    }
}

delete newCfg;
int* myInts = NULL;
myInts = new Int[2];
myInts = new Int[5];
delete myInts; // <-- only deletes memory for Int[5],
               // Int[2] memory is dangling in no-mans-land
int*myInts=NULL;
myInts=新的Int[2];
myInts=新的Int[5];

删除myInts;//最好使用智能指针(例如,shared_ptr),这样您就不必关心“新建”和“删除”的配对。您是建议在while循环完成之前还是在for循环完成之后删除newCfg?
newCfg
只有您创建的最后一个对象,您还需要检查所有其他对象。至于何时删除:当您不再需要对象时(因此以后没有代码会尝试访问删除的对象),在解算器完成迭代后,它会返回移动,然后我会迭代以打印出每个步骤。建议在打印出每个步骤后,迭代结果并删除其中的上一步?是的,如果在该点之后不再使用moves数组(更准确地说,是他们的
previous
成员),这样做仍然会导致解算器类中的内存泄漏。不过这次只有16个直接损失和48个间接损失。我创建了一个deletePrev()方法,该方法删除了以前的内容。谢谢您的评论。打印解算器的结果后,我现在会删除每个游戏内部移动的每个前一个。然而在那之后,我仍然在Solver.h类中有一个漏洞。漏洞仍然发生在
newCfg=newgame(cfg)您是否仍在泄漏相同数量的内存?或者在你的移动向量中删除游戏后,它会显著减少吗?现在直接损失了16次,间接损失了48次。你能用现在的代码和更新的valgrind报告更新你原来的帖子吗?我不知道你为什么还在泄漏内存,其他人可能会给你指出正确的方向。。。