我使用的代码块时:获取分割故障运行的发行版本,而不是调试版本代码块
Release 13.12 rev 9501 (2013-12-25 18:25:45) gcc 4.8.2 Linux/unicode - 64 bit
在以下系统:
Linux Mint 17.3 Cinnamon (version 2.8.7) 64-bit
Intel Core i7-4790
NVIDIA GeForce GTX 750 Ti
当我设置选择目标“调试”并运行我的代码,它完美的工作。我已经运行了很多次,没有任何问题。但是,当我选择“释放”目标并经常从命令提示符运行程序时,会出现分段错误。
我的C++程序大约有一千行,我不知道程序的哪一部分导致了分段错误。所以我不知道在这个阶段哪个代码是相关的(当我有更多的信息时,我会在这里发布一些代码)。它确实利用指针和动态数据结构。我猜测有些东西没有被正确初始化,但是我不知道如何去调试“Release”版本。我没有改变任何编译器或链接器设置的默认值。 “版本”版本中可能会有什么不同导致此问题?
(更新)按照Nathan的建议,我能够找出分段故障。有一个for循环,但在这个循环中的某些情况下上限(终点指标)没有被初始化,沿着线:
void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
if (!var_val)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
我能解决这个问题,通过初始化的“end_idx “变到零(” st_idx”总是大于一):
void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[])
{
int idx, end_idx;
if (test_val > inp_val)
end_idx = someFn(inp_val, lim_idx, xarr);
else
end_idx = 0;
if (!var_val)
for (idx = st_idx; idx <= end_idx; idx++)
xarr[idx] = 0;
}
是否有可能获得代码块/ GCC编译器,当一个变量没有被初始化这样发出警告?我看到有一个GCC选项: - 初始化,但我没有看到这在Code Blocks中。
使用一些'cout'语句来标记代码块。一旦你错了,你至少应该知道什么阻止了它,然后你从那里缩小它的范围。但你是对的。这很可能意味着你的代码中有一些UB。 – NathanOliver