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制作一个临时变量了,我们明确指出了这是一个副本(引用,其实就是被引用对象的副本),他在子函数执行结束的时候也就不会在被释放了。

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

转载于:https://www.cnblogs.com/audi-car/p/4762845.html

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

  1. C++面试题:内存的分配方式有几种?

    为了面试,你还在死啃那些经典的面试题,网络上五花八门的面试题,学完之后,你觉得自己有提升吗?如果没有的话,是不是应该换个思路去想一下如何提升自己的能力.今天为大家带来的面试题是:内存的分配方式有几种? ...

  2. 引用和指针-内存的分配方式有几种

    1: (1)从静态存储区域分 转载于:https://www.cnblogs.com/lovemi93/p/7644574.html

  3. 操作系统:内存连续分配方式采用的几种算法及各自优劣

    连续分配方式(交换技术),是指为一个用户程序分配一个连续的内存空间.它主要包括单一连续分配.固定分区分配和动态分区分配. 注意:此处的连续内存分配是将整个进程的数据整块加载到内存之中. 1.单一连续分 ...

  4. 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  5. Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  6. c语言链表动态分配内存,链表的C语言实现(含动态内存分配)

    转自:http://blog.csdn.net/21aspnet/article/details/146968 链表的C语言实现(含动态内存分配) 上 链表的C语言实现之动态内存分配 一.为什么用动态 ...

  7. LwIP 之六 详解内存池(memp.c/h)动态内存管理策略

      对于嵌入式开发来说,内存管理及使用是至关重要的,内存的使用多少.内存泄漏等时刻需要注意!合理的内存管理策略将从根本上决定内存分配和回收效率,最终决定系统的整体性能.LwIP 就提供了 动态内存堆管 ...

  8. JVM内存调优原则及几种JVM内存调优方法

    JVM内存调优原则及几种JVM内存调优方法 1.堆大小设置. 2.回收器选择. 1.在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因 ...

  9. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...

最新文章

  1. jenkins+ant+jmeter接口测试
  2. JNI编程基础(二)——Android Studio NDK开发
  3. SwiftUI之如何创建常量绑定与自定义绑定
  4. 全国计算机等级考试题库二级C操作题100套(第95套)
  5. C#语法糖 Null 条件运算符 【?.】
  6. 多进程 VS 多线程
  7. Java基础篇:什么是异常,异常处理的基础是什么?
  8. php 上楼梯问题 递归,算法:爬楼梯问题中的递归
  9. Matlab:求出n边凹多边形内角
  10. 乒乓球比赛赛程_2020乒乓球比赛赛程表
  11. 用“江湖兵器排行榜”前10的语言输出hello world,你会几种?顺便拜拜祖师爷!
  12. 负载均衡——三角传输
  13. yigo基础学习笔记4_业务报表
  14. 我也说说《变形金刚》2
  15. 跳动爱心代码-李峋爱心代码(手把手教学)
  16. 基于Mind+、MOTT实现人工智能
  17. 【运维面试】公司拒绝了你,后来又通知你去上班,还要不要去?
  18. Java Statement一次执行多条sql语句
  19. 计算机科学文科学士,计算机科学文科学士
  20. 服务里面找不到mysql

热门文章

  1. findHomography(src_points, dst_points, CV_RANSAC)
  2. 无线路由器的使用方法
  3. C语言之prinf的用法
  4. [LeetCode 001] Two Sum
  5. C/C++动态二维数组的内存分配和释放
  6. CSS 禁止文字选中
  7. DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习
  8. p2p网络测试工具_自媒体 IPFS官方升级DHT方案,提升网络整体性能
  9. mysql 基于集_一种基于记录集查找特定行的方法_MySQL
  10. body click js 委托_自动化测试之selenium调用JS语句