内存的分配方式有几种? 动态内存的的传递注意事项!

1、内存的分配方式分为   静态存储区、栈、堆。

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,比如   全局变量。

栈:在栈上创建,在函数(main函数或其他子函数)执行期间,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动释放。所以我们不能返回在函数内部定义的变量(函数内定义的指针可以返回),因为他们在函数执行结束时已经被销毁了。处理器的指令集中有关于栈内的分配运算,因此效率很高,但是分配的内存资源有限。

堆:从堆上分配,亦称为动态内存分配,使用new或malloc等申请任意多内存,程序员自己决定何时释放内存,使用灵活,问题也经常出现在这里。

2、动态内存的传递:

首先,子函数内不能返回出指针之外的其他变量,http://www.cnblogs.com/audi-car/p/4753292.html

其次,调用子函数时,编译器默认情况下,会自动为参数列表的每个参数制作临时的变量,这些临时变量的改变并不能真正传回到主函数内,且这些临时变量会在函数调用结束时,自动销毁(动态申请的内存除外,它不会销毁)。所以靠他们来实现参数或者内存的传递纯属扯淡。

最典型的例子,就是比较基础的swap()函数,还有下面这个例子:

void getMemory(char *p)
{
    p=new char[10];
}

int main(int argc, char **argv)
{
    char *str=NULL;
    getMemory(str);
    //char *str=new char[10];
    cout<<str<<endl;
    return 0;
}

在执行cout<<str<<endl;时,程序会崩溃。因为这个指针没有初始化,也没能从子函数内申请到内存空间,是指向未知位置的,所以会崩。。

3、怎么解决第2步的问题?

很简单,用引用就可以解决了

void getMemory(char *&p)    //使用引用
{
    p=new char[10];
}

int main(int argc, char **argv)
{
    char *str=NULL;
    getMemory(str);
    //char *str=new char[10];
    cout<<str<<endl;
    return 0;
}

4、为什么使用引用就可以解决问题了呢?

因为这个时候,编译器就不会在给参数p制作一个临时变量了,我们明确指出了这是一个副本(引用,其实就是被引用对象的副本),他在子函数执行结束的时候也就不会在被释放了。

以上内容,个人观点,欢迎指正。

时间: 2024-08-30 02:18:52

内存的分配方式有几种? 动态内存的的传递注意事项!的相关文章

内存的分配方式

一.内存的分配方式 程序占用的内存分为五个区域: 1.静态区/全局区(static)存放静态变量.全局变量,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间始终不变.2.栈区(stack)存放函数的参数值.局部变量的值等,由编译器自动分配释放.管理简单,空间使用效率高,但是生命周期很短暂,分配的内存容量有限.用来存储函数的参数和非静态局部变量.3.堆区(heap)也叫动态内存分配.程序在运行的时候new申请任意大小的内存,一般由程序员分配释放,如果程序员没有释放掉,程序会一直占用内

FreeRTOS 动态内存管理

本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建. 信号量. 消息队列. 事件标志组. 互斥信号量. 软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的. 动态内存管理介绍FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现,这 5 个文件在 FreeRTOS

C++的动态内存管理,new/delete

C++动态内存管理: 在C++程序中对任何内置或用户自定义的类型控制的内存进行分配与释放. C++动态内存分配使用的符号 new / delete (C++内置类型) 动态内存分配new的优势,可以在运行时动态分配内存的大小: 在C语言中声明一个字符串数组如下: char a[1000]; 但是如下模式不能通过,原因是char 声明的字符串的大小必须是常量,如下模式不能通过编译 int  a = 10000; char c[a]; 但是对于new生成的存储空间则不存在以上问题,new申请的内存可

内存分配的几种方式,以及动态内存传递的注意事项

一.内存的分配方式?静态存储区,栈,堆 静态存储区:内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在,比如说全局变量. 栈:在栈上创建,在函数执行期间,函数内部局部变量和形参可以在栈上创建,函数执行这些存储单元自动释放.所以我们不能返回在函数内部定义的变量(函数定义的指针可以返回),因为他们在函数执行结束时已经被销毁了,处理器的指令集有关于站内部的分配运算,因此效率很高,但是分配的内存资源有限. 堆:从堆上分配,也称为动态内存分配,使用new malloc等申请任意多内存,程序

Java静态内存与动态内存分配的解析

1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会 自动释放所占用的内存空间. 变量的分配与释放,都无须程序员自行考虑. eg:基本类型,数组 2. 动态内存 用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配. 3. 区别 a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用

内存连续分配管理方式

内存连续分配方式,是指为一个用户程序分配一个连续的内存空间.它主要包括单一连续分配.固定分区分配和动态分区分配. 单一连续分配 内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分:用户区是为用户提供的.除系统区之外的内存空间.这种方式无需进行内存保护. 这种方式的优点是简单.无外部碎片,不需要额外的技术支持.缺点是只能用于单用户.单任务的操作系统中,有内部碎片,存储器的利用率极低. 固定分区分配 固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若

简单理解动态内存分配和静态内存分配的区别

在涉及到内存分配时,我们一般都要考虑到两种内存分配方式,一种是动态内存分配,另一种是静态内存分配,我们该怎么理解这两者的区别呢? 在我看来,静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态内存分配的方式进行的.而链表,它的信息有可能会随时更改,内存的分配取决于我们实际输入的数据,这样就用到了动态内存分配的方式. 静态内存分配是在程序编译或者运行过程中,按事先规定的大小分配内存空间的分配方式,他的前提的必须事先知

C和C指针小记(十六)-动态内存分配

动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. 3)如果输入数组的数据超过来数组的容纳范围,程序必须以一种合理的方式作出响应.但是程序员一般不会做这个判断. 1.2 malloc 和 free malloc 和 free 分别用于执行动态分配内存和释放. stdlib.h 中声明来这两个函数的原型 void malloc( size_t siz

【C语言天天练(九)】动态内存分配

引言:数组的元素存储于内存中连续的位置上.当一个数组被声明时.它所须要的内存在编译时就被分配. 可是,我们能够使用动态内存分配在执行时为它分配内存. 一块内存的生命周期能够分为四个阶段:分配.初始化.使用.释放. 内存的分配一般使用C函数库里的malloc函数(原型:void *malloc(size_t size)). 关于malloc函数应该注意一下几点: 1.malloc的參数就是须要分配的内存的字节数. 2.malloc所分配的是一块连续的内存. 3.分配成功.则返回指向分配内存起始地址