【VS开发】【C/C++开发】C++参数策略传递内存
参数策略
如果函数的参数是一个指针,不要指望用该指针去动态申请内存。如下:

- void GetMemory(char *p, int num)
- {
- p = (char *)malloc(sizeof(char) * num);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(str, 100); //str仍未NULL
- strcpy(str, "hello"); //运行错误
- }

原因是编译器总是为每个参数制作临时副本。指针参数p, 其副本为_p,使_p=p。如果改变了_p所指的内容,相应的p所指的内容也跟着改变(毕竟指向同样的地方)。但是在GetMemory中动态分配内存空间,改变了_p的内容。在调用函数中的p还是指向NULL。再者,因为函数GetMemory中动态分配了空间,但是没释放,这样调用一次函数,就泄露了一次内存。图示:
如果非得用指针参数申请内存,可以用指针的指针作为参数申请内存

- void GetMemory(char **p, int num)
- {
- *p = (char *)malloc(sizeof(char) * num);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(&str, 100); //记得加地址符
strcpy(str, "hello");
free(str)- }

原理是一样的,比较难理解,图示表示:
比较好的方法是传指针的引用

- #include <iostream>
- #include <string>
- #include <cstring>
- #include <cstdlib>
- using namespace std;
- void GetMemory(char *&p, int num)
- {
- p = (char *)malloc(sizeof(char) * num);
- }
- void Test(void)
- {
- char *str = NULL;
- GetMemory(str, 100);
- strcpy(str, "hello");
- cout << str << endl;
- free(str);
- }
- int main()
- {
- Test();
- }

这里注意指针的引用 为char* &a,要是不好理解可以这样:
- typedef char* pchar;
- pchar &a
返回值策略
可以用函数返回值来传递动态内存。这中方法比“指针的指针”简单多了

- char *GetMemory(int num)
- {
- char *p = (char *)malloc(sizeof(char) * num);
- return p;
- }
- void Test(void)
- {
- char *str = NULL;
- str = GetMemory(100); //str指向了动态分配的空间
- strcpy(str, "hello");
- free(str)
- }

在使用返回值时,千万别返回指向“栈内存”的指针、引用,因为该内存在函数结束时自动消亡了,返回的指针是个野指针了。例如

- char *GetString()
- {
- char p[] = "hello world"; //数组内容存储在栈区,函数结束时,会释放掉
- return p;
- }
- void Test(void)
- {
- char *str = NULL;
- str = GetString(); //因为非配的内存早已释放掉,此时的str是个野指针,内容是垃圾
- cout << str << endl;
- }

在函数中不定义数组,定义指针,示例:

- char *GetString()
- {
- char *p = "hello world"; //数组内容存储在静态区,函数结束时,不会释放掉
- return p;
- }
- void Test(void)
- {
- char *str = NULL;
- str = GetString();
- cout << str << endl;
- }

此时的程序是正确的,但是有一点,此时分配的内存处于静态区,是只可以读取但是不可以修改的。
【VS开发】【C/C++开发】C++参数策略传递内存的更多相关文章
- Web开发基本准则-55实录-缓存策略
续上篇<Web开发基本准则-55实录-Web访问安全>. Web开发基本准则-55实录-缓存策略 郑昀 创建于2013年2月 郑昀 最后更新于2013年10月26日 提纲: Web访问安全 ...
- 《JavaScript设计模式与开发实践》读书笔记之策略模式
1.策略模式 定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换 1.1 传统实现 根据工资基数和年底绩效来发送年终奖 var calculateBonus= function (perfo ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境
目标 配置一个spark standalone集群 + akka + kafka + scala的开发环境. 创建一个基于spark的scala工程,并在spark standalone的集群环境中运 ...
- 嵌入式开发平台-iTOP-4418开发板
详情转自:http://topeetboard.com S5P4418核心板可以无缝支持核心系统S5P6818,并保持底板设计不变,将兼顾更高端 的应用领域,为项目和产品提供更好的灵活性以及可伸缩性. ...
- Web程序员开发App系列 - 开发我的第一个App,源码下载
Web程序员开发App系列 Web程序员开发App系列 - 认识HBuilder Web程序员开发App系列 - 申请苹果开发者账号 Web程序员开发App系列 - 调试Android和iOS手机代码 ...
- Loadrunner 脚本开发-利用loadrunner开发Windows Sockets协议脚本
脚本开发-利用loadrunner开发Windows Sockets协议脚本 by:授客 QQ:1033553122 欢迎加入软件性能测试交流QQ群:7156436 实践举例 Socket服务端简单实 ...
- 带你从零学ReactNative开发跨平台App开发(一)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
随机推荐
- 《Redis 设计与实现》读书笔记(四)
独立功能的实现 十八.发布和订阅 发布和订阅由下面几条命令组成 PUBLISH,发布消息,例如PUBLISH SUBSCRIBE,订阅某个频道 SUBSCRIBE UNSUBSCRIBE 退订某个频道 ...
- Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) A. CME
链接: https://codeforces.com/contest/1241/problem/A 题意: Let's denote correct match equation (we will d ...
- PHP mysqli_options() 函数
定义和用法 mysqli_options() 函数设置额外的连接选项,用于影响连接行为. mysqli_options() 函数可以被调用若干次来设置若干个选项. <?php $con=mysq ...
- [Luogu] 列队
https://www.luogu.org/problemnew/show/P3960 如果 x = 1,相当于维护一条链,每次取出第 k 个数放在序列末尾假设有 n + m + q 个位置,每个位置 ...
- codeforces685B
CF685B Kay and Snowflake 题意翻译 输入一棵树,判断每一棵子树的重心是哪一个节点. 题目描述 After the piece of a devilish mirror hit ...
- Python数据抓取(1) —数据处理前的准备
(一)数据抓取概要 为什么要学会抓取网络数据? 对公司或对自己有价值的数据,80%都不在本地的数据库,它们都散落在广大的网络数据,这些数据通常都伴随着网页的形式呈现,这样的数据我们称为非结构化数据 如 ...
- 删除线性表中为x的元素的三种简单算法。
//删除线性表中不为x的元素. void delete_list(Sqlist &L,int x){ ; ;i < L.length;i++){ if(L.data[i] != x){ ...
- python 绘制sinx
code import turtle import math turtle.speed() turtle.penup() turtle., * math.sin((-/) * * math.pi)) ...
- 关于使用express作为spa应用服务的问题
前端工程师应该知道,spa是基于前端路由的单页面应用,如果服务端不做相应的配置,会经常出现404的问题. 一般的做法是默认返回应用的首页. express // 安装相关依赖 npm install ...
- 8.5 JavaScript的BOM(二)
8.5 JavaScript的BOM 即 浏览器对象模型(Browser Object Model) 浏览器对象包括 一.Window(窗口) 如果需要打开一个新的网站,应该通过超级链接等方式让用户主 ...