小例子
例:
int a=123; //放到栈区
int *p;
p=&a; //这是执行的,放到代码区
malloc 和 new 的区别
malloc 手工分配的内存是申请的堆区,归操作系统管理;若不释放可能会发生内存泄漏。
new 和他一样的使用方法。
二者区别:
内存分配失败时候,返回值不同。
new 内存分配失败时,会抛出 bad_alloc 异常,它不会返回NULL。
malloc 分配内存失败时,会返回 NULL.。
char *p=NULL;
//分配4个字节的内存 这在临时区 也就是栈区
p=(char *)malloc(100);
//这才把p放到堆区
if(p!=NULL){free(p)};
四区的简单介绍
分析:
1.栈区(stack):
由编译器自动分配释放,存放函数的参数值,局部变量的值。
2.堆区(heap):
一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。
3.全局区(静态区)(static):
全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放.
(常量区):
字符串常量和其他常量的存储位置,程序结束后由操作系统回收。
4.程序代码区:
存放函数体的二进制代码。
规则1:
在main分配的内存都可以在被调用函数中使用
规则2:
在被调用函数的栈中分配的内存,主函数不可使用 ,因为被调用函数结束调用就释放了,地址里就没内容了,除非放到malloc中才可使用。
例如:
char *l()
{
char buff [ 30 ] ;
strcpy ( buff , " asdfsadf " ) ;
return buff ;
}
(2013编译器提示,返回局部变量或临时变量的地址,函数结束后就清空了这个函数的所有栈中的东西,返回有什么用?又取不出来)
(PS:此处可以理解为 返回值之后 栈区因为被释放,导致数据丢失,然后无法输出栈区之前写的值)
这个函数一旦结束调用, buff 就被清空,除非 malloc,但需要 cstdlib(头文件名称)。
char *buff = (char*)malloc(30 * sizeof(char));
这样才是对的
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
char * kk()
{
char *buff = (char*)malloc(30 * sizeof(char));
//char buff[30];
strcpy(buff, "asdfsdf");
return buff;
}
void fun()
{
char* b=kk();
printf("main123kk:%c\n", b[2]);
}
int main()
{
fun();
getchar();
}
引用我看到过最能清晰解释四区如何运行以及其作用的一张图片。

本文介绍了C++中的内存四区——栈、堆、全局(静态)区和程序代码区,包括它们的作用和管理方式。特别讨论了malloc与new的区别,以及内存分配的规则。栈区由编译器自动分配释放,用于存放函数参数和局部变量;堆区由程序员管理,需要手动释放;全局区和静态区存储全局变量和静态变量,程序结束后由操作系统回收。文章还提到了函数内部分配的内存不能在函数外部使用,除非使用malloc。
580

被折叠的 条评论
为什么被折叠?



