Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 坏内存管理?递归函数中大于1的类成员(布尔)值_C++_Memory_Memory Leaks_Recursion - Fatal编程技术网

C++ 坏内存管理?递归函数中大于1的类成员(布尔)值

C++ 坏内存管理?递归函数中大于1的类成员(布尔)值,c++,memory,memory-leaks,recursion,C++,Memory,Memory Leaks,Recursion,我正在研究一个子图匹配问题(匹配分子中的化学官能团)。原始代码是由另一个学生编写的(在Visual C++下,没有MS特定的库),并且在Windows 上 Run罚款。然后,我在程序中添加了新函数,但没有改变子图匹配的算法,新程序在gcc4.2/Mac OS X下编译良好。但是,我在运行时遇到了奇怪的问题 此处相关的对象及其成员: Atom:包含ID、元素、键列表(指向键对象的指针向量)、搜索标记(bool)。函数获取变量并将搜索标记设置为true或false Bond:包含一个指向原子A和原子

我正在研究一个子图匹配问题(匹配分子中的化学官能团)。原始代码是由另一个学生编写的(在Visual C++下,没有MS特定的库),并且在Windows 上<强> Run罚款。然后,我在程序中添加了新函数,但没有改变子图匹配的算法,新程序在gcc4.2/Mac OS X下编译良好。但是,我在运行时遇到了奇怪的问题

此处相关的对象及其成员:

  • Atom:包含ID、元素、键列表(指向键对象的指针向量)、搜索标记(bool)。函数获取变量并将搜索标记设置为true或false

  • Bond:包含一个指向原子A和原子B的两个指针数组,以及一个使用参数atom*B调用时返回atom*A的函数,反之亦然

  • 分子:包含指向原子的指针向量,以及使用原子ID或向量中的位置获取原子*的函数

  • 原子的一个子类:哈米特原子。它包含的额外成员是指向相关分子原子的原子指针

  • 这是递归函数的算法: 对于阵列A中的每个原子,将其与阵列B中的一个原子进行比较(哈米特群,通常大小约为10-20个原子)。如果元素相同,则获取每个元素的连接原子列表,然后重复。被测试的原子在一路上都有标记,因此在某一点上不会再有未标记的连接原子

    这是代码(未更改的,只有cout位由我添加用于测试)。 第一次调用函数时,第一个向量是来自测试分子的单个原子,第二个向量是哈米特群分子的第二个原子。(哈米特的第一个原子ID为“X”,可以是任何东西。)

    对不起,如果时间太长了但问题是,在我标记了“X”原子(哈米特分子中的第一个原子)并试图获得搜索标记布尔值之后,它的值大于1。因此X被错误地“标记”了好几次,并且“真值”计数器一直上升,直到达到条件truth==unmarked\u bonding.size()

    我不确定实际的问题是什么?值128表示内存/指针有问题,但我不确定如何找到答案。我甚至不确定它是否与递归函数有关

    如果有人能提出一些我可以尝试的建议,我将不胜感激。提前谢谢

    附加说明:Atom类函数的代码

     string Atom::getID()
    {
    return id;
    }
    
    string Atom::getEle()
    {
    return ele;
    }
    void Atom::mark()
    {
    search_mark = true;
    }
    
    void Atom::demark()
    {
    search_mark = false;
    }
    void HammettAtom::mark(Atom* assigned)
    {
    search_mark = true;
    related_mol_atom = assigned;
    }
    bool Atom::isMarked()
    {
    return search_mark;
    }
    

    谢谢你的建议。 在Valgrind下运行程序后,很明显问题与内存泄漏有关。我移动了分配器在已识别的“deinitely lost”问题中的位置,搜索标记问题似乎已被删除。程序现在按预期运行,但内存泄漏。
    不过,我还没有设法解决内存泄漏问题,我发布了一个新问题

    谢谢你的建议。 在Valgrind下运行程序后,很明显问题与内存泄漏有关。我移动了分配器在已识别的“deinitely lost”问题中的位置,搜索标记问题似乎已被删除。程序现在按预期运行,但内存泄漏。
    不过,我还没有设法解决内存泄漏问题,我发布了一个新问题

    我做了更多的测试,在第一次调用函数之前,原子X和第一个分子原子的“search_mark”布尔值肯定为零。您是否尝试过在Valgrind下运行它?atom::isMarked()正在返回布尔值。由于某些原因,它没有打印为0或1。如果您尝试将其存储为局部变量(即在cout语句之前进行调用),会发生什么情况?@tmpearce尝试了这一点,结果是相同的。似乎是一个子类problem@AdamRosenfield没有,我只是在gdb下调试。这似乎也是哈米特原子亚类的一个问题,因为分子原子(不在该亚类中)似乎被标记为精细。我以前没有用过Valgrind,你是说Memcheck工具吗?我正在安装它。我已经做了更多的测试,在第一次调用函数之前,原子X和第一个分子原子的“search_mark”布尔值肯定为零。你试过在Valgrind下运行它吗?atom::isMarked()正在返回布尔值。由于某些原因,它没有打印为0或1。如果您尝试将其存储为局部变量(即在cout语句之前进行调用),会发生什么情况?@tmpearce尝试了这一点,结果是相同的。似乎是一个子类problem@AdamRosenfield没有,我只是在gdb下调试。这似乎也是哈米特原子亚类的一个问题,因为分子原子(不在该亚类中)似乎被标记为精细。我以前没有用过Valgrind,你是说Memcheck工具吗?我正在安装它
     currently at molecule atom ID 1
    
     size of Hammett array: 1 size of mol array: 1
     size of unmarked H array: 1 size of unmarked mol array: 1
     atom in um_mol array considered ID: 1 Ele: N
     atom in um_h_array considered ID: N1
     N1is unmarked
     found same ele between mol_id 1 and ham_id N1
    
     size of Hammett array: 3 size of mol array: 3
     size of unmarked H array: 3 size of unmarked mol array: 3
     atom in um_mol array considered ID: 2 Ele: H
     atom in um_h_array considered ID: O2
     O2is unmarked
     atom in um_h_array considered ID: O1
     O1is unmarked
     atom in um_h_array considered ID: X
     X is unmarked
     mol atom ID 2 marked as X, current truth: 1
     X is now marked(1)/unmarked(0) 128 and break loop 
     atom in um_mol array considered ID: 8 Ele: C
     atom in um_h_array considered ID: O2
     O2is unmarked
     atom in um_h_array considered ID: O1
     O1is unmarked
     atom in um_h_array considered ID: X
     X is unmarked
     mol atom ID 8 marked as X, current truth: 2
     X is now marked(1)/unmarked(0) 160 and break loop 
     atom in um_mol array considered ID: 17 Ele: C
     atom in um_h_array considered ID: O2
     O2is unmarked
     atom in um_h_array considered ID: O1
     O1is unmarked
     atom in um_h_array considered ID: X
     X is unmarked
     mol atom ID 17 marked as X, current truth: 3
     X is now marked(1)/unmarked(0) 128 and break loop 
     found same atom
     Hammet group 2 checkSubproblem true
     Hammett added to atom 1
    
     string Atom::getID()
    {
    return id;
    }
    
    string Atom::getEle()
    {
    return ele;
    }
    void Atom::mark()
    {
    search_mark = true;
    }
    
    void Atom::demark()
    {
    search_mark = false;
    }
    void HammettAtom::mark(Atom* assigned)
    {
    search_mark = true;
    related_mol_atom = assigned;
    }
    bool Atom::isMarked()
    {
    return search_mark;
    }