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++里是如何分配内存的的捏??

 

引用了别人的一段:

在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 都是局部变量! 这里都在栈上!这是指针指向的内容在常量区!

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

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

到这吧!明天继续!哈哈

 

 

 

 

 

 

 

 

原文链接: https://www.cnblogs.com/leisure/archive/2011/10/21/2220695.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++内存管理初涉(一)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/34779

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午11:41
下一篇 2023年2月8日 上午11:41

相关推荐