传递动态内存

一、内存分配分类

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

2.在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。

3.从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

二、传递动态内存

1.动态指针传递失败

 1 #include<iostream>
 2 using namespace std;
 3 void GetMe(char *p,int num)
 4 {
 5     p=(char*)malloc(sizeof(char)*num);
 6 }
 7 int main()
 8 {
 9     char *str=NULL;
10     GetMe(str,100);
11     strcpy(str,"Hello!");
12     cout<<str<<endl;
13     return 0;
14 }

结果:程序运行奔溃,因为str还是为NULL,往空的地址强行赋值时,内存出错

原因:str并没有获取指针p开辟的空间。本质为调用函数 GetMe 时,函数会初始化函数内的局部变量,同时为传进来的实参str(指针和值都创建,引用除外)创建一个副本 _p,  _num,所以 p申请了内存,只是把p指向的内存地址改变,而str并没有改变,所以str依然没有获得内存。同时每次p申请的内存都不会得到释放,最终会造成内存泄露。

2.正确的传递动态内存

2.1  返回指针

 1 #include<iostream>
 2 using namespace std;
 3 char* GetMe(char *p,int num)
 4 {
 5     p=(char*)malloc(sizeof(char)*num);
 6     return p;
 7 }
 8 int main()
 9 {
10     char *str=NULL;
11     str=GetMe(str,100);
12     strcpy(str,"Hello!");
13     cout<<str<<endl;
14     delete str;
15     return 0;
16 }

结果:正常运行

原因:p申请了空间,并将该空间的地址作为返回值传给str,这样str就指向了p申请的内存空间

2.2 传递指针

 1 #include<iostream>
 2 using namespace std;
 3 void GetMe(char **p,int num)
 4 {
 5     *p=(char*)malloc(sizeof(char)*num);
 6 }
 7 int main()
 8 {
 9     char *str=NULL;
10     GetMe(&str,100);
11     strcpy(str,"Hello!");
12     cout<<str<<endl;
13     delete str;
14     return 0;
15 }

结果:正常运行

原因:传递了str的指针给函数GetMe(),那么p就是str的地址的副本,地址的副本指向的内存是固定,所以该函数是为str地址指向的str开辟空间

总结:实际上指针传递仍然是一种值传递,只不过在参数是指针的时候,传递的是指针的副本,这样在地址上的操作实际就反映到了内存中



原文地址:https://www.cnblogs.com/Dana-gx/p/9741225.html

时间: 2024-11-08 08:53:20

传递动态内存的相关文章

函数不能传递动态内存

https://blog.csdn.net/zjwson/article/details/64123320 1.问题:主要是避免在函数体中为传入的指针直接申请内存,因为传入的实参会发生复制,而函数体是对复制的形参进行操作,并没有直接对实参进行操作: 解决方案: 1)传入char** p指针,然后对*p进行操作:或者char* p,对*p=x:明白一点,复制的形参和实参指针都指向同一个地址: 2) 原文地址:https://www.cnblogs.com/wllwqdeai/p/10726917.

getMemory()-传递动态内存

void getMemory(char *p) { p=(char *)malloc(100); } char * getMemory(char *p) { char ch[]="hello world"; return ch; } char * getMemory(char **p) { *p=(char*)malloc(100); return *p; } int main() { char *str=NULL; // getMemory(str); getMemory(&

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

1.内存的分配方式分为   静态存储区.栈.堆. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,比如   全局变量. 栈:在栈上创建,在函数(main函数或其他子函数)执行期间,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动释放.所以我们不能返回在函数内部定义的变量(函数内定义的指针可以返回),因为他们在函数执行结束时已经被销毁了.处理器的指令集中有关于栈内的分配运算,因此效率很高,但是分配的内存资源有限. 堆:从堆上分配,亦称为动态

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

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

C++ Primer笔记8_动态内存_智能指针

1.动态内存 C++中,动态内存管理是通过一对运算符完成的:new和delete.C语言中通过malloc与free函数来实现先动态内存的分配与释放.C++中new与delete的实现其实会调用malloc与free. new分配: 分配变量空间: int *a = new int; // 不初始化 int *b = new int(10); //初始化为10 string *str = new string(10, ); 分配数组空间: int *arr = new int[10];//分配的

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

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

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

继承和动态内存分配

假设基类使用了动态内存分配,而且定义了析构函数.复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数.复制构造函数和赋值函数. 当基类和派生类采用动态内存分配时,派生类的析构函数.复制构造函数.赋值运算符都必须使用相应的基类方法来处理基类元素.这种要求是通过三种不同的方式来满足的.对于析构函数.这是自动完成的,也就是说在派生类的析构函数中无需显示调用基类的析构函数.对于构造函数,这是通过在初始化成员类别中调用基类的复制构造函数来完成的,如果不这样做,将

《C++primer(第五版)》学习之路-第十二章:动态内存

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 12.1 动态内存与智能指针 1.在C++中,动态内存的管理是通过一对运算符来完成:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存. 2. shared_ptr允许多个指针指向同一个对象:unique_ptr则"独占"所指向的对象.标准库还定义了一个名为weak_pt