假设我有以下c ++代码
int main()
{
const int n = 10;
int *pa = new int[n];
for (int i=0; i!=n; ++i) pa[i] = 0;
cout << pa[n] << endl;
delete[] pa;
}
实际上,这段代码可以由g ++编译并运行,但是由于pa[n]
不在数组范围内,因此结果错误。
我的问题是:是否可以在编译阶段为g ++设置一些调试器标志,以便编译器可以提示我这一点?此外,在g ++中进行调试的正常标志设置是什么?
答案 0 :(得分:0)
使用-fsanitize=address
进行编译有时会有所帮助;参见AddressSanitizer。
此外,使用-g
进行编译并在valgrind
下运行程序会发现许多动态内存错误(quick intro)。
通常,您要启用基本的编译器警告。 -Wall -Wextra -pedantic -O2
是一个好的开始。 -O2
从技术上讲是为了优化,但有时您会收到更多/更好的警告。
-g
标志将调试信息包含在已编译的代码中。如果使用调试器,则可以查看局部变量的名称/值,行号等。这可能与重新排序或直接删除一些代码的优化冲突。建议使用-g -Og
进行调试(而不是-O2
)。