• 关于 0xCCCCCCCC


    http://xingyunbaijunwei.blog.163.com/blog/static/76538067201281793111474/

    http://stackoverflow.com/questions/370195/when-and-why-will-an-os-initialise-memory-to-0xcd-0xdd-etc-on-malloc-free-new

    在vc中,指针初始值为0xcccccccc,所有指针好像都为这个,为什么,和NULL有什么关系?

            VC的DEBUG版会把未初始化的指针自动初始化为0xCCCCCCCC(0xcccccccc是程序不能访问的地址,访问时会触发异常,当然换个别的也有这个效果,可能c是1100的缘故,被MS使用了)因为万一不小心访问了这个地址,是很容易出问题的,不像0x00000000,很容易让本该在调试阶段发现的问题从眼皮底下溜走。比如,如下代码:
                     char *p;
                     delete p;
            如果在DEBUG版下p被初始化为0x000000000,那么一个非常严重的bug就这么从眼皮底下溜走了,等换到release版出了问题,你还纳闷呢。


            在VC Debug版本里,栈中分配的值都会先用0xCCCCCCCC来处理一下,所以大家在Debug模式下调试程序发现在引用0xCCCCCCCC这样的值, 就说明在试图使用一个没有初始化的值。这就是在Debug模式下调试的好处之一,如果在Release模式下,系统就不会用0xCCCCCCCC来处理一 下了。至于为什么选择0xCCCCCCCC大概是因为端点中断int 3 对应的机器码就是0xCC吧。

            VC的DEBUG版会把未初始化的指针自动初始化为0xCCCCCCCC,而不是就让它随机去,那是因为DEBUG版的目的是为了方便我们调试程序的,如果野指针的初值不确定,那么每次调试同一个程序就可能出现不一样的结果,比如这次程序崩掉,下次正常运行,再一次虽然没崩掉,但结果不对……那显然对我们 解bug是非常不利的。 


            DEBUG版本为了能让程序员更早的发现错误,把堆栈上的数据对初始化成了0xcc,也就是说局部变量如果不初始化,那 么DEBUG版本中就会是0xCC。

            Debug为了调试方便,也就是其Edit And Continue特性,为每个函数都多分配了64个字节。当用户在调试时在代码里增加少量变量的时候,编译器就可以分配那64个字节的空间过去,这样就不 用重新编译程序来重新调试。


            最后,编译器能帮我们的毕竟是有限的,对于指针变量,最好还是我们自己每一次在定义时就给它赋初值。

  • 相关阅读:
    断点下载
    根据显示的字符多少来做Label的自适应高度
    iOS中POST异步请求
    iOS中两个APP之间的跳转和通信
    cocoapod [!] /usr/bin/curl -f -L -o /var/folders/dj/yccslvys6tb53k2vz87djfsh0000gn/T/d20170219-12508-z77a4l/file.zip https://github.com/kylefleming/opencv/releases/download/3.1.0-ios-fix/opencv2.fram
    使用webview加载html图片、表单超屏幕问题
    uiwebview 加载html时字体变小 加载前或加载后改变字体大小
    uitabbarController tababr 上方横线隐藏
    uinavigationcontroller uinavigationbar 下方横线去除
    贝赛尔曲线 绘制园
  • 原文地址:https://www.cnblogs.com/qrlozte/p/5106781.html
Copyright © 2020-2023  润新知