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

今天在写一个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; 细分分析 单一的指标数据或大维度…

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…

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

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

Hadoop示例程序WordCount详解及实例

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

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

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

JFinal整合CKFinder

2019独角兽企业重金招聘Python工程师标准>>> 使用JFinal对之前的系统进行重构&#xff0c;老系统使用了CKEditorCKFinder编辑器&#xff0c;发现在web.xml中配置ConnectorServlet会被JFinalFilter过滤处理&#xff0c;而且使用JFinal之后也不想在web.xml中增加额外的…

.NET 6新特性试用 | TryGetNonEnumeratedCount

前言.NET 6新增了TryGetNonEnumeratedCount方法&#xff0c;计算可枚举类型的元素总数。LINQ不是已经有了Count方法吗&#xff0c;为什么还要画蛇添足呢&#xff1f;Demo尝试下列代码&#xff1a;var b new B<int>(); Console.WriteLine($"{b.Count()}");var …

研究表明:喝酒“上脸”是基因突变,不仅容易老年痴呆,还容易得胃癌

全世界只有3.14 % 的人关注了爆炸吧知识本文转自科研大匠“喝酒上脸的人能喝&#xff01;”这句话&#xff0c;不管来自天南还是海北的&#xff0c;在酒桌上&#xff0c;肯定都耳熟能详有没有&#xff1f;其实&#xff0c;喝酒“上脸”并不意味着能喝&#xff0c;而是一种基因突…

本科、硕士、博士的区别(终极版)

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术本科生和研究生到底有何区别&#xff1f;硕士和博士又有什么不同&#xff1f;这是很多人都有的困惑&#xff0c;对于这个问题的说法也有很多版本&#xff0c;我们挑选了几个比较经典的版本&#xff0c;以期能和大家一同探…

Linux 环境变量 $PATH

我们知道查阅文件属性的指令 ls 完整文件名为&#xff1a;/bin/ls(这是绝对路径)&#xff0c;那为什么可以在任何地方执行/bin/ls 这个指令呢&#xff1f; 为什么在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢&#xff1f; 这是因为环境变量 …

文件项目SVN+TortoiseSVN+Subclipse使用总结

近来使用开辟的过程中涌现了一个小问题&#xff0c;顺便记录一下原因和方法--文件项目 一、SVN、TortoiseSVN、Subclipse分析 团队开辟技术&#xff1a; (1)单元测试&#xff1b;(2)版本控制&#xff1b; (3)项目主动化&#xff1b; SCM:软件配置管理&#xff0c;包含SVN&#…

PHP中常见的五种设计模式

设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为。实际上&#xff0c;设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利&#xff0c;那么它们又是什么&#xff1f;为什么说它们在 PHP 应用程序中非常有用&#xff1f;本文解释了这些问题。 设…

Java常用类集接口以及实现方式总结

最近学习map-reduce原理以及map-reduce编程&#xff0c;于是顺带着学习下Java编程&#xff0c;对于Java常用的数据结构和类集&#xff0c;我总结到mind图中&#xff0c;便于理清相互之间的关系 package leiji; import java.util.ArrayList; import java.util.List; import java…

Android之Launcher分析和修改1——Launcher默认界面配置(default_workspace)

www.cnblogs.com/mythou/p/3153880.html 最近工作都在修改Launcher&#xff0c;所以打算把分析源码和修改源码的过程记录下来&#xff0c;最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher&#xff0c;所以后面文章里面的Launcher都是基于Android4.0.…

如果你喜欢上了一个程序员小伙 献给所有程序员女友(来自ITeye博客的文章 作者:talent2012)...

程序员向来是善于幽默自嘲的群体&#xff0c;但从某种程度上影响了咱程序员在广大女同胞心中的印象啊&#xff5e;&#xff5e; 于是写下此篇&#xff08;有从别处看到的3句加进来的&#xff09;&#xff0c; 就算是为咱程序员做个广告&#xff5e;&#xff5e;要是觉得有点过的…