引用:杨丽慧 的 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++中的内存分配、文件操作提供了基础。而编译原理的知识则能帮助学生解析C++中看似复杂的语法规则,揭示其背后的设计意图。 数学课程在C++学习中同样不可或...
### C++内存管理创新:GC Allocator #### 引言 在C++编程中,内存管理一直是一个关键且复杂的任务。大多数C++程序员不得不手动管理内存,包括分配和释放内存资源,这不仅耗时而且容易出错。随着软件工程的发展,...
此外,C++支持动态内存分配,如使用new和delete关键字。动态内存管理虽然提供了更大的灵活性,但也带来了内存泄漏和悬挂指针的风险。因此,理解何时创建和释放内存至关重要。 异常处理是C++中的错误处理机制,它...
13. 动态内存管理:C++提供了new和delete运算符来动态分配和释放内存。 14. 命名空间和模块化编程:命名空间可以防止名称冲突,模块化编程有助于代码的组织和重用。 15. 函数模板和类模板:模板允许编写与数据类型...
- Pascal 通常由编译器管理内存,而 C++ 需要程序员手动管理内存,使用 `new` 和 `delete` 分配和释放内存。 7. **指针和引用**: - Pascal 有指针类型,但不如 C++ 指针灵活。C++ 引用提供了一个安全的指针替代...
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的...
2. **内存管理**:C++允许直接管理内存,包括动态分配和释放,这涉及到指针的概念。理解指针是学习C++的一大挑战,但也是其强大之处,因为可以直接操作内存,实现高效编程。 3. **面向对象编程**:C++支持类、对象...
理解指针的使用,包括指针的声明、赋值、解引用和动态内存分配,能帮助避免常见的内存泄漏和悬挂指针问题。 4. **模板与泛型编程**:C++的模板允许编写通用代码,可以用于处理不同数据类型。泛型编程是利用模板实现...
6. **动态内存管理**:在处理大量数据或创建复杂对象时,可能会用到指针和动态内存分配。例如,贪吃蛇游戏中,蛇的身体部分可以由一个动态分配的数组表示。 7. **文件操作**:如果游戏包含保存和加载进度的功能,...
在C++的世界里,像计算机科学家一样思考意味着对底层机制有深刻的理解,包括内存管理、对象模型、编译原理等。C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程和泛型...
在内存思考题中,GetMemory函数的实现和调用展示了动态内存分配和释放的重要性。第一个Test函数可能会导致空指针异常,因为GetMemory函数内的malloc并未改变Test函数中的str指针。第二个Test函数返回的是局部数组的...
4. **性能优化**:C++提供了低级别的内存操作功能,允许开发者更精细地控制资源分配,从而达到更高的运行效率。 5. **安全性**:尽管C++提供了一些可能引发安全问题的特性(如指针操作),但同时也提供了一些工具和...
11. **内存管理**:动态内存分配(new和delete操作),以及智能指针(如unique_ptr、shared_ptr)的使用。 12. **I/O流**:iostream库中的cin和cout进行输入输出,以及fstream库用于文件操作。 通过这些实例,你...
此外,命名空间用于避免命名冲突,静态成员和动态内存分配(new和delete)也是C++程序员需要掌握的关键概念。 最后,C++11、C++14、C++17等新标准引入了大量现代化特性,如lambda表达式、右值引用、auto类型推断、...
书中还会介绍如何有效地使用C++的内存管理,包括动态内存分配、智能指针和资源管理。理解内存管理是避免内存泄漏和悬空指针等常见错误的关键。 此外,作者还会讨论一些现代C++的特性,如C++11及后续版本引入的特性...
在C++的学习过程中,掌握内存管理至关重要,包括动态内存分配(new和delete操作符)和智能指针(如unique_ptr、shared_ptr、weak_ptr)。了解如何正确管理内存可以避免内存泄漏和悬挂指针等问题。 C++11、C++14、...