美文网首页
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++内存管理之“烫”和“屯”

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

  • c++内存管理

    c++内存管理长文 c++内存管理

  • C++ 内存分配和管理

    C++ 内存分配和管理

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • “屯屯屯”和“烫烫烫”

    内存没有初始化: 栈中内存没有初始化:出现烫 堆中内存没有初始化:出现屯

  • 第二章 Java内存区域和内存溢出异常

    概述 java内存管理相比于C和C++自己管理内存方便了很多,不用自己手动去管理和释放内存,不必为每一个对象...

  • 内存优化(一)内存泄漏

    1.内存泄漏 C/C++ 自己去分配内存和释放内存——手动管理malloc和free 1.1.什么是内存泄露:内存...

  • Java GC

    概述 GC => 垃圾回收 = 回收可用空间 + 压缩内存 内存管理 手动内存管理 => C | C++ 自动内存...

  • android 内存泄漏全面解析

    引言: C/C++ 自己去分配内存和释放内存--手动管理 malloc free 什么是内存泄露:内存不在GC掌...

  • C++之内存布局

    在C++之内存管理一文中,我们已经了解到C++的内存管理,这里介绍C++的典型内存布局结构。 1、总体来说,C/C...

网友评论

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

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