假设我有以下 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++ 中调试的正常标志设置是什么?
最佳答案
使用 -fsanitize=address
进行编译有时可以提供帮助;请参阅AddressSanitizer .
此外,使用 -g
编译并在 valgrind
下运行程序发现许多动态内存错误 ( quick intro )。
一般来说,您希望启用基本的编译器警告。 -Wall -Wextra -pedantic -O2
是一个好的开始。 -O2
从技术上讲是为了优化,但有时你会收到更多/更好的警告。
-g
标志包含已编译代码中的调试信息。如果您使用调试器,您将能够看到局部变量的名称/值、行号等。这可能与重新排序或彻底删除某些代码的优化发生冲突。建议使用-g -Og
进行调试(而不是-O2
)。
关于c++ - 设置 g++ 编译器标志以进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58144968/