zoukankan      html  css  js  c++  java
  • C++内存管理初涉(一)

    这个是笔记,大牛们直接掠过........

    先来看一段程序:

     1 #include "stdafx.h"
    2 #include "iostream.h"
    3
    4 int main(int argc, char* argv[])
    5 {
    6
    7 char a[] = "hello";
    8 a[0] ='X';
    9 cout << a << endl;
    10 char *p = "world"; // 注意p指向常量字符串
    11 p[0] = 'X'; // 编译器不能发现该错误
    12 cout << p << endl;
    13 return 0;
    14 }

    报错了吧:

    这个是因为当我们声明了数组时,它的存储位置是:静态存储区!而指针却不一样,它将被放进常量储存区,这里是不允许修改的!

    引发了一个问问:C++里是如何分配内存的的捏??

    引用了别人的一段:

    在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 

      栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 

      堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。 

      自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 

      全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。 

      常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

    基本解答了一些疑惑!所以,

     1 int main(int argc, char* argv[])
    2 {
    3 int q=123;
    4 int *g=&q;
    5 cout<<g<<endl;
    6 char a[] = "hello";
    7 a[0] ='X';
    8 cout << a << endl;
    9 char *p = "world"; // 注意p指向常量字符串
    10 // p[0] = 'X'; // 编译器不能发现该错误
    11 cout << p << endl;
    12 return 0;
    13 }

    这里 变量q,指针g 都是局部变量! 这里都在栈上!这是指针指向的内容在常量区!

    怎么区分呢??我曾今问人:“怎么检测啊”,回答“常识还需要检测啊?”

    所以,慢慢用,你就记住了!

    到这吧!明天继续!哈哈



  • 相关阅读:
    设置系统时间
    设置访问URL不要项目名二级目录
    tomcat部署项目报错NoSuchMethodException#addServlet,addFilter
    Java多线程-线程池ThreadPoolExecutor构造方法和规则
    IDEA Debug 快捷键
    收藏网站
    eclipse添加hadoop插件
    Frida Mac环境搭建
    Android UiAutomator 1&2
    Android下monkey命令参数
  • 原文地址:https://www.cnblogs.com/leisure/p/2220695.html
Copyright © 2011-2022 走看看