本文共 1268 字,大约阅读时间需要 4 分钟。
Debug模式下的代码比release模式具有更多的检测,比如在windows平台上assert宏只在release模式下有效。Linux上则没有这个限制,无论Debug还是release模式assert都生效,但是如果你想让assert失效,编译的时候 加上 -DNDEBUG 即可。
我们都说了Debug模式可以帮我们检测一些东西,但是可能会有额外的性能开销(虽然微不足道)。默认下Linux的动态库文件是集于Debug 和 release于一身的。看看这个列子
#includeusing namespace std;int main(){ vector v; v.reserve(10); //容量为10 但是size 为0 v[3] = 1; return 0;}
下面这份代码在windows 下的Debug模式下会崩溃,release模式下不会崩溃,这是因为windows下的vector对operator[] 做了assert的检测。那么我们跑这份代码在Linux下,它并不会报错,所以那我们如何开启真真的Debug 模式呢?
如果我们想开启Debug模式必须定义上面的宏
gcc是有专门的debug容器的,这些容器使用起来和标准容器一模一样,所以放心使用就好,但是有个准则就是俩个不同的.o文件内不能一个使用了debug模式的容器,一个没使用debug模式下的容器,这俩个.o文件是不能链接到一起的。
1 #include2 #define _GLIBCXX_DEBUG 3 4 int main() 5 { 6 __gnu_debug::vector v; 7 v.reserve(10); 8 v[3]=1; 9 return 0; 10 }[yutian@~]$ ./a.out /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/debug/vector:265: error: attempt to subscript container with out-of-bounds index 3, but container only holds 0 elements.Objects involved in the operation:sequence "this" @ 0x0x7ffeae481db0 { type = NSt7__debug6vectorIiSaIiEEE;}Aborted (core dumped)