`
xujinquan19
  • 浏览: 150468 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C++内存分配思考

    博客分类:
  • C++
阅读更多

引用:杨丽慧 的 C++内存分配的五种方法

    也不知道是不是她,当初我拷贝这篇文章时没注意作者是谁,现在需要引用,特意找了一下,如果不对,请指正。

正文:

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

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

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

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

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

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

验证程序:

测试:
#include <iostream>
using namespace std;
const int abc =125;
const int abcd = 125;
int abc1 = 12;
int abc2 = 12;

void text(int **p1,int **p2)
{
 int a =1;
 int b =1;
 cout<<"stack text:"<<&a<<"  "<<&b<<endl;

 static int a1 = 1;
 static int b1 = 1;
 cout<<"static text:"<<&a1<<"  "<<&b1<<endl;

 char* cp1="sadfsafasfasdf";
 char* cp2="sadfsafasfasdf";
 cout<<"const test:"<<(int)cp1<<" "<<(int)cp2<<endl;

 *p1 = new int;
 *p2 = new int;
}

int main()
{
 int *p1,*p2;
 text(&p1,&p2);

 int a =1;
 int b =1;
 cout<<"stack main:"<<&a<<"  "<<&b<<endl;

 static int a1 = 1;
 static int b1 = 1;
 cout<<"static main:"<<&a1<<"  "<<&b1<<endl;

 char* cp1="sadfsafasfasdf";
 char* cp2="sadfsafasfasdf";
 cout<<"const main:"<<(int)cp1<<"  "<<(int)cp2<<endl;

 int *p3 = new int;
 int *p4 = new int;
 cout<<"heap text:"<<p1<<"  "<<p2<<endl;
 cout<<"help main:"<<p3<<"  "<<p4<<endl;


 cout<<"const:"<<&(abc)<<" "<<&abcd<<endl;
 cout<<"Global"<<&abc1<<"  "<<&abc2<<endl;


 delete p1;
 delete p2;
 delete p3;
 delete p4;
 return 0;
}
结果:
stack text:0xbfac1c7c  0xbfac1c78
static text:0x804a04c  0x804a050
const test:134516012 134516012
stack main:0xbfac1cb4  0xbfac1cb0
static main:0x804a044  0x804a048
const main:134516012  134516012
heap text:0x89a5008  0x89a5018
help main:0x89a5028  0x89a5038
const:0x8048d94 0x8048d98
Global0x804a03c  0x804a040

分析:仁者见仁,智者见智(欢迎讨论)

问题1:需要4B,堆给我分配了16B?

问题2:静态变量存储如何实现?

问题3: const int 算不算常量?

内存何时释放问题:

栈:
#include <iostream>
using namespace std;

char* text()
{
 char a[] ="fadsfasf";
 return a;
}

int main()
{
 char *p=text();
 cout<<p<<endl;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
??3?
fadsfasf
success

静态变量
#include <iostream>
using namespace std;

char* text()
{
 static char a[] ="fadsfasf";
 return a;
}

int main()
{
 char *p=text();
 cout<<p<<endl;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
fadsfasf
fadsfasf
success

堆:
#include"string.h"
#include <iostream>
using namespace std;
char* text()
{
 char* p = new char[8];
 strcpy(p,"fadsfasf");
 return p;
}
int main()
{
 char *p=text();
 cout<<p<<endl;
 delete []p;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
fadsfasf
fadsfasf
success

常量区
#include"string.h"
#include <iostream>
using namespace std;

char* text()
{
 return ("fadsfasf");
}

int main()
{
 char *p=text();
 cout<<p<<endl;
 char a[] ="fadsfasf";
 cout<<a<<endl;
 cout<<"success"<<endl;
}
结果:
fadsfasf
fadsfasf
success

 全局变量

分析

结论:

    好像只有栈在函数返回时释放,全局区,静态区,常量区,堆都不释放....

分享到:
评论

相关推荐

    c++指针深入思考和相关用法

    理解指针是掌握C++的关键,因为它涉及到内存管理、动态内存分配以及高效的数据结构实现等重要方面。本文将深入探讨指针的四大要素:指针的类型、指针所指向的类型、指针的值和指针本身所占据的内存区,并通过实例...

    C++语言教学思考c加加语言程序设计视频教学1.docx

    例如,在讲解C++内存管理时,可以引入操作系统中的内存分配概念;在讲述面向对象编程时,提及程序设计语言原理中的相关理论;在教授算法时,结合数据结构和算法分析课程的内容。这样,学生不仅能学习到C++的语法,还...

    C++语言教学思考c加加语言程序设计视频教学1.pdf

    操作系统课程中的进程管理、内存管理和文件管理,为理解C++中的内存分配、文件操作提供了基础。而编译原理的知识则能帮助学生解析C++中看似复杂的语法规则,揭示其背后的设计意图。 数学课程在C++学习中同样不可或...

    C++ Memory Management Innovation

    ### C++内存管理创新:GC Allocator #### 引言 在C++编程中,内存管理一直是一个关键且复杂的任务。大多数C++程序员不得不手动管理内存,包括分配和释放内存资源,这不仅耗时而且容易出错。随着软件工程的发展,...

    像计算机科学家一样思考 c++

    此外,C++支持动态内存分配,如使用new和delete关键字。动态内存管理虽然提供了更大的灵活性,但也带来了内存泄漏和悬挂指针的风险。因此,理解何时创建和释放内存至关重要。 异常处理是C++中的错误处理机制,它...

    小甲鱼C++课程笔记

    13. 动态内存管理:C++提供了new和delete运算符来动态分配和释放内存。 14. 命名空间和模块化编程:命名空间可以防止名称冲突,模块化编程有助于代码的组织和重用。 15. 函数模板和类模板:模板允许编写与数据类型...

    pascal转c++_pascal转c++教程_

    - Pascal 通常由编译器管理内存,而 C++ 需要程序员手动管理内存,使用 `new` 和 `delete` 分配和释放内存。 7. **指针和引用**: - Pascal 有指针类型,但不如 C++ 指针灵活。C++ 引用提供了一个安全的指针替代...

    C语言内存分布图(计算机基础知识)

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

    像计算机科学家一样思考C++

    2. **内存管理**:C++允许直接管理内存,包括动态分配和释放,这涉及到指针的概念。理解指针是学习C++的一大挑战,但也是其强大之处,因为可以直接操作内存,实现高效编程。 3. **面向对象编程**:C++支持类、对象...

    像计算机科学家一样思考 c++.

    理解指针的使用,包括指针的声明、赋值、解引用和动态内存分配,能帮助避免常见的内存泄漏和悬挂指针问题。 4. **模板与泛型编程**:C++的模板允许编写通用代码,可以用于处理不同数据类型。泛型编程是利用模板实现...

    c++小游戏(附源码)

    6. **动态内存管理**:在处理大量数据或创建复杂对象时,可能会用到指针和动态内存分配。例如,贪吃蛇游戏中,蛇的身体部分可以由一个动态分配的数组表示。 7. **文件操作**:如果游戏包含保存和加载进度的功能,...

    像计算机科学家一样思考C++(2)

    在C++的世界里,像计算机科学家一样思考意味着对底层机制有深刻的理解,包括内存管理、对象模型、编译原理等。C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程和泛型...

    C++高级编程 指南

    在内存思考题中,GetMemory函数的实现和调用展示了动态内存分配和释放的重要性。第一个Test函数可能会导致空指针异常,因为GetMemory函数内的malloc并未改变Test函数中的str指针。第二个Test函数返回的是局部数组的...

    C++的设计与演化——电子书

    4. **性能优化**:C++提供了低级别的内存操作功能,允许开发者更精细地控制资源分配,从而达到更高的运行效率。 5. **安全性**:尽管C++提供了一些可能引发安全问题的特性(如指针操作),但同时也提供了一些工具和...

    c++完美演泽程序 C++的教材代码

    11. **内存管理**:动态内存分配(new和delete操作),以及智能指针(如unique_ptr、shared_ptr)的使用。 12. **I/O流**:iostream库中的cin和cout进行输入输出,以及fstream库用于文件操作。 通过这些实例,你...

    Think in C++

    此外,命名空间用于避免命名冲突,静态成员和动态内存分配(new和delete)也是C++程序员需要掌握的关键概念。 最后,C++11、C++14、C++17等新标准引入了大量现代化特性,如lambda表达式、右值引用、auto类型推断、...

    Thinking in C++(第二版)

    书中还会介绍如何有效地使用C++的内存管理,包括动态内存分配、智能指针和资源管理。理解内存管理是避免内存泄漏和悬空指针等常见错误的关键。 此外,作者还会讨论一些现代C++的特性,如C++11及后续版本引入的特性...

    西工大C++答案

    在C++的学习过程中,掌握内存管理至关重要,包括动态内存分配(new和delete操作符)和智能指针(如unique_ptr、shared_ptr、weak_ptr)。了解如何正确管理内存可以避免内存泄漏和悬挂指针等问题。 C++11、C++14、...

Global site tag (gtag.js) - Google Analytics