0

因此,对于一个项目,我决定制作一个数独求解器,它首先使用找到裸单曲(只有一个可能值的单元格),然后暴力破解它的胜利之路。

这是我第一次在程序中使用多个文件,因此我第一次使用 makefile,但我得到的错误不是在编译期间,所以我认为我的 makefile 很好。

我尝试使用 GSB 进行调试,但它似乎并没有太大帮助......如果我不得不猜测我认为我的类 Cell 的析构函数出现了问题。

为了给你一个项目的简要概述,所以我不只是向你吐代码:类拼图包含类 Cell 的 9x9 矩阵。Cell 类包含两个整数来表示棋盘上的位置(行和列)、一个整数值(单元格的实际值)和一个由 9 个布尔值组成的数组,这些布尔值表示单元格值的可能候选者(0 在数组表示该值不是可能的候选值,1 表示它是) - 例如,candidate[2] 是数组中的第三个值,所以如果它是 1,则意味着 3 是单元格的可能值。

现在进入代码。我的代码由 5 个文件组成:main.cpp、puzzle.cpp、cell.cpp、puzzle.h 和 cell.h。这是我的 5 个文件的 pastebin 和 makefile 的链接

我建议你不要关注puzzle.cpp 中的巨大函数(checkConflicts() 和 EliminationCandidates()),因为它们都很长,如果语句确保没有单元格冲突/消除冲突候选者。

调试器跳转到删除候选数组的单元格析构函数,但我看不出它有问题!

这是我在制作和运行程序后得到的错误的副本:

$ make
g++ -c puzzle.cpp cell.h
g++ -c cell.cpp
g++ -o sudsolve main.cpp puzzle.o cell.o

$ ./sudsolve 
*** Error in `./sudsolve': munmap_chunk(): invalid pointer: 0x0000000000a30fd4 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7f576)[0x7fcaecc1f576]
./sudsolve[0x40bbdb]
./sudsolve[0x401cd2]
./sudsolve[0x402a12]
./sudsolve[0x402a84]
./sudsolve[0x402299]
./sudsolve[0x401e38]
./sudsolve[0x40156a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7fcaecbc1ea5]
./sudsolve[0x400eb9]
======= Memory map: ========
00400000-0040e000 r-xp 00000000 fc:04 2097787                            /home/silman/Documents/programming/ecs60/sudsolve/sudsolve
0060d000-0060e000 r--p 0000d000 fc:04 2097787                            /home/silman/Documents/programming/ecs60/sudsolve/sudsolve
0060e000-0060f000 rw-p 0000e000 fc:04 2097787                            /home/silman/Documents/programming/ecs60/sudsolve/sudsolve
00a30000-00a51000 rw-p 00000000 00:00 0                                  [heap]
7fcaec89b000-7fcaec99e000 r-xp 00000000 fc:04 1576781                    /lib/x86_64-linux-gnu/libm-2.17.so
7fcaec99e000-7fcaecb9e000 ---p 00103000 fc:04 1576781                    /lib/x86_64-linux-gnu/libm-2.17.so
7fcaecb9e000-7fcaecb9f000 r--p 00103000 fc:04 1576781                    /lib/x86_64-linux-gnu/libm-2.17.so
7fcaecb9f000-7fcaecba0000 rw-p 00104000 fc:04 1576781                    /lib/x86_64-linux-gnu/libm-2.17.so
7fcaecba0000-7fcaecd5e000 r-xp 00000000 fc:04 1576733                    /lib/x86_64-linux-gnu/libc-2.17.so
7fcaecd5e000-7fcaecf5d000 ---p 001be000 fc:04 1576733                    /lib/x86_64-linux-gnu/libc-2.17.so
7fcaecf5d000-7fcaecf61000 r--p 001bd000 fc:04 1576733                    /lib/x86_64-linux-gnu/libc-2.17.so
7fcaecf61000-7fcaecf63000 rw-p 001c1000 fc:04 1576733                    /lib/x86_64-linux-gnu/libc-2.17.so
7fcaecf63000-7fcaecf68000 rw-p 00000000 00:00 0 
7fcaecf68000-7fcaecf7c000 r-xp 00000000 fc:04 1576758                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcaecf7c000-7fcaed17c000 ---p 00014000 fc:04 1576758                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcaed17c000-7fcaed17d000 r--p 00014000 fc:04 1576758                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcaed17d000-7fcaed17e000 rw-p 00015000 fc:04 1576758                    /lib/x86_64-linux-gnu/libgcc_s.so.1
7fcaed17e000-7fcaed263000 r-xp 00000000 fc:04 271362                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fcaed263000-7fcaed462000 ---p 000e5000 fc:04 271362                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fcaed462000-7fcaed46a000 r--p 000e4000 fc:04 271362                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fcaed46a000-7fcaed46c000 rw-p 000ec000 fc:04 271362                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.17
7fcaed46c000-7fcaed481000 rw-p 00000000 00:00 0 
7fcaed481000-7fcaed4a4000 r-xp 00000000 fc:04 1576709                    /lib/x86_64-linux-gnu/ld-2.17.so
7fcaed684000-7fcaed689000 rw-p 00000000 00:00 0 
7fcaed6a0000-7fcaed6a3000 rw-p 00000000 00:00 0 
7fcaed6a3000-7fcaed6a4000 r--p 00022000 fc:04 1576709                    /lib/x86_64-linux-gnu/ld-2.17.so
7fcaed6a4000-7fcaed6a6000 rw-p 00023000 fc:04 1576709                    /lib/x86_64-linux-gnu/ld-2.17.so
7fff88ba8000-7fff88bc9000 rw-p 00000000 00:00 0                          [stack]
7fff88bfe000-7fff88c00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)
4

1 回答 1

0

问题是您调用delete了一个未使用new. 作为参考,这里是Cellpastebin 中的剥离类:

class Cell{
public:
    ~Cell()
    {
        delete[] candidates;
    }

private:
        bool candidates[9];
};

候选数组的空间与你的类一起分配,当你的类被删除时它会自动释放(这会自动发生,因为它是在堆栈上分配的)。您只需要为先前使用分配的内存调用 delete new

于 2013-07-14T01:50:18.800 回答