关于用函数指针参数申请动态内存的问题

今天在写一个Binary Search Tree的程序时,发现其插入有问题,下面是插入程序,每次插入完成后,节点还是NULL。

template<typename Object>
void CMyTree<Object>::insert(const Object& element, BinaryNode<Object>* node)
{
if(node == NULL)
node = new BinaryNode<Object>(element);		//新建节点,插入
else if(element < node->element)
insert(element, node->left);		//从左边递归
else if(node->element < element)
insert(element, node->right);		//从右边递归
}
        仔细检查后发现了问题的所在,我使用了函数指针参数来申请动态内存。突然想起在《高质量C/C++编程》一书中,作者曾提出了“ 如果函数的参数是一个指针,不要指望用该指针去申请动态内存”,而我正犯了这个错误。下面将结合该书对此问题做深入分析,以此记录,避免以后再犯错。

       我们将上述问题抽象出来,如下代码:

#include <iostream>
using namespace std;
void func(int* t)
{
t = new int;
}
int   main()
{
int* test =NULL;
func(test);
delete test;
system("pause");
return   0;
} 

        首先来分析下指针参数传递的原理。编译器总是要给每个函数参数创建一个临时副本,例如指针参数m的临时副本是_m,_m=m,此时_m和m指向同一段内存地址,如图1所示。因此,当我们修改地址1的内容时,实际也就修改了m所指向的内存的内容,这一点与我们平时使用指针参数的目的是一致的。然而,当我们修改_m的值(为其申请动态内存)时,只是将_m指向另一段内存地址(地址2),而m仍然指向地址1,这就相当于值传递了,是无法更改变量内容的。同时,这么做的话为造成内存泄露。

    如果需要通过指针参数来申请动态内存,有三种做法:

(1)使用指向指针的指针参数,即func(int** t)

void func(int** t)
{
*t = new int;
}
<pre class="cpp" name="code">int   main()
{
int* test =NULL;
func(&test);
delete test;
system("pause");
return   0;
} 
 

 (2)使用指针的引用,即func(
int*& t) 

void func(int* &t)
{
t = new int;
}
int   main()
{
int* test =NULL;
func(test);
delete test;
system("pause");
return   0;
} 
(3)使用函数返回值来传递动态内存,即 int* func()
int* func()
{
int* t = new int;
return t;
}
int   main()
{
int* test =func();
delete test;
system("pause");
return   0;
} 
 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

当全家人一起看电影,播到羞羞镜头时......

1 我看你好眼熟哦&#xff08;via.松鼠少儿&#xff0c;侵删&#xff09;▼2 妹妹&#xff1a;有没有想过我感受&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 遇见五步蛇怎么办&#xff08;via.阿森不是妖怪&#xff0c;侵删&#xff09;▼4 一年级…

网站分析常用方法

本篇文章我们介绍4种网站分析中最常用&#xff0c;也是最有效的分析方法。他们分别是细分分析&#xff0c;对比分析&#xff0c;对比分析&#xff0c;质与量分析。这些分析方法在实际工作中经常组合使用。我们先来看下细分分析。 1&#xff0c; 细分分析 单一的指标数据或大维度…

Jmeter录制app脚本

前期准备电脑安装Jmeter&#xff1b;手机&#xff1b;wifi;操作步骤&#xff1a;1、启动Jmeter2、“测试计划”中添加“线程组”&#xff1b;3、“工作台”中添加“HTTP代理服务器”&#xff1b;4、配置代理服务器&#xff1a;Global Settings下面的端口配置&#xff1a;9988&a…

PPT设计中的用图问题

好的图片对于PPT的重要性&#xff0c;这已是不争的事实。但是PPT设计者往往不是设计出身&#xff0c;因此在一些PPT案例中图片运用不当也是经常可以看见的&#xff0c;介绍一些图片的基本知识&#xff0c;希望有助于大家更好的理解图片&#xff0c;并且更好地在PPT中运用图片。…

浅谈C++类(1)--概念和构造函数

迎转载&#xff0c;但请标明作者 “九天雁翎”&#xff0c;当然&#xff0c;你给出这个帖子的链接更好。 类多么重要我就不多说了&#xff0c;只讲讲学习&#xff0c;因为个人认为类的学习无论从概念的理解还是实际代码的编写相对其他C兼容向的代码都是比较有难度的&#xff0…

asp.net webapi bug : System.OperationCanceledException 异常处理

asp.net webapi的过滤器 ExceptionFilterAttribute 捕获一个异常消息如下&#xff1a;检测到站点发生错误 "已取消该操作。"错误跟踪: 在 System.Threading.CancellationToken.ThrowIfCancellationRequested() 在 System.Web.Http.Filters.ActionFilterAttribute.d__…

vscode中vue项目报错

当在vscode中写代码时&#xff0c;报错报错报错......... 已经头大&#xff0c;还没写就报错&#xff0c; 这是因为eslint对语法的要求太过严格导致的编译时&#xff0c;出现各种语法格式错误 我们打开vue.config.js&#xff0c;加上这句代码&#xff0c;就OK啦 lintOnSave:…

nginx连接uwsgi使用web.py框架构造pythonweb项目

2019独角兽企业重金招聘Python工程师标准>>> 相关页面&#xff1a;http://webpy.org/installhttp://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.htmlhttp://projects.unbit.it/uwsgi/wiki/Example uwsgi的安装需要python-devel&#xff0c;可以使用yum s…

《SAS编程与数据挖掘商业案例》学习笔记之九

继续之前的读书笔记&#xff0c;废话少说&#xff0c;直奔主题。 本文重点在infile语句。 十一&#xff1a;infile语句 Dsd 规定一个数据集可以包含分隔符&#xff0c;但是要用引号括起来&#xff0c;两个连续分隔符之间的数作为缺失值处理&#xff0c; 默认分隔符为逗号 Fir…

.NET WinForm程序中给DataGridView表头添加下拉列表实现数据过滤

转&#xff1a;http://www.cnblogs.com/jaxu/archive/2011/08/04/2127365.html 我们见过Excel中的数据过滤功能&#xff0c;可以通过点击表头上的下拉列表来实现数据的过滤&#xff0c;这个功能很实用&#xff0c;省去了我们需要在程序中单独设计数据的查询过滤模块&#xff0c…

减少联调、高效集成,试试这个工具

大家好&#xff0c;我是Z哥。最近在工作中学习到一个我觉得很有价值的小工具&#xff0c;在这里与大家分享一下。这个小工具需要自己稍作开发&#xff0c;并不存在什么第三方的现成工具供你使用&#xff0c;因为这个工具的核心关键是「数据」&#xff0c;而「数据」这个东西对于…

浅谈C++类(7)--析构函数

欢迎转载&#xff0c;但请标明作者 “九天雁翎”&#xff0c;当然&#xff0c;你给出这个帖子的链接更好。 不知不觉我都写了6讲了&#xff0c;的确这样讲出来的学习才能迫使我真的去调试每个书上出现的代码&#xff0c;去想些自己能讲出什么新的书上没有的东西&#xff0c;这才…

Hadoop示例程序WordCount详解及实例

2019独角兽企业重金招聘Python工程师标准>>> 1.图解MapReduce MapReduce整体流程图 并行读取文本中的内容&#xff0c;然后进行MapReduce操作 Map过程&#xff1a;并行读取三行&#xff0c;对读取的单词进行map操作&#xff0c;每个词都以形式生成 reduce操作是对ma…

《SAS编程与数据挖掘商业案例》学习笔记之十

继续之前的读书笔记&#xff0c;本次讲解sas主要的变量操作&#xff0c;包括基本赋值语句、累加语句、keep语句、retain语句、array语句、rename语句、length语句。 1.基本赋值语句 zx y; zsum(x,y); sum函数的好处是可以克服缺失值的影响&#xff1b; 2.如果表达式中既有数值…

title与h1标签的区别和联系

很多新站长在网站SEO过程中&#xff0c;会认为把H1等同于Title。 其实两是有区别和联系的&#xff0c;两者不能划等号。下面主要从文章和页面角度分析title和H1。 H1等同于title吗? H1不等于title。H1&#xff0c;大标题。一般出现在文章页面&#xff0c;作用如同一张报…

浅谈C++类(5)--友元

欢迎转载&#xff0c;但请标明作者 “九天雁翎”&#xff0c;当然&#xff0c;你给出这个帖子的链接更好。 呵呵&#xff0c;又来了&#xff0c;自从我开始尝试描述类以来&#xff0c;我发现我自己是开始真的了解类了&#xff0c;虽然还不到就明白什么叫oo的高深境界&#xff0…

.NET 云原生架构师训练营(系统架构)--学习笔记

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章目录对外展现的功能内部功能功能交互与价值通路系统架构目标认识系统的价值通路认识功能架构&#xff0c;通过把功能结构与形式结构结合来描…