美文网首页
C++内存管理之“烫”和“屯”

C++内存管理之“烫”和“屯”

作者: porridgechen890 | 来源:发表于2018-11-14 16:06 被阅读14次

    Visual Studio和Xcode

    区别在于:两种IDE对未初始化的内存是否赋初值,对释放的内存是否清空。

    Visual Studio环境下

    VC++为了方便调试,在Debug模式下,会把未初始化的栈内存全部填成0xCC。会把未初始化的堆内存全部填成0xCD。但是Release 模式下不会有这种附加动作,原来那块内存里是什么就是什么。

    未初始化的栈变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是“烫”字。同理,0xCDCD就是“屯”字。参考的文章

    Xcode环境下

    虽然Xcode里也有分Debug和Release模式。
    在Product->Scheme->Edit Scheme->Run->Build Configuration里。
    但是在Debug模式下不会去给未初始化的变量赋初值。也不会把delete掉的内存清零。

    //这段代码说明Xcode环境Debug模式下,delete掉一块内存不会去把那块内存清零。
    #include <iostream>
    int main(int argc, const char * argv[]) {
        int * p = new int(4);
        std::cout << *p << std::endl;
        delete p;
        //正常情况下是一定要写p=nullptr的,但是万一忘了写这句话的话就会出现下面的问题
        //p = nullptr;
        std::cout << "p已经被delete掉了,还可以使用p。*p=" << *p << std::endl;
        return 0;
    }
    
    //这段代码说明p指向的那块内存被释放后没有清零,又分配给了q
    #include <iostream>
    int main(int argc, const char * argv[]) {
        int * p = new int(4);
        delete p;
        //正常情况下是一定要写p=nullptr的,但是万一忘了写这句话的话就会出现下面的问题
        //p = nullptr;
        int * q = new int;
        std::cout << *q << std::endl;//这里会打印出4
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C++内存管理之“烫”和“屯”

          本文链接:https://www.haomeiwen.com/subject/lhirfqtx.html