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

举报
chenyu 发表于 2021/07/27 02:08:21 2021/07/27
【摘要】 今天在写一个Binary Search Tree的程序时,发现其插入有问题,下面是插入程序,每次插入完成后,节点还是NULL。 template<typename Object>void CMyTree<Object>::insert(const Object& element, BinaryNode<Object>* nod...


  
  1. template<typename Object>
  2. void CMyTree<Object>::insert(const Object& element, BinaryNode<Object>* node)
  3. {
  4. if(node == NULL)
  5. node = new BinaryNode<Object>(element); //新建节点,插入
  6. else if(element < node->element)
  7. insert(element, node->left); //从左边递归
  8. else if(node->element < element)
  9. insert(element, node->right); //从右边递归
  10. }
如果函数的参数是一个指针,不要指望用该指针去申请动态内存

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


  
  1. #include <iostream>
  2. using namespace std;
  3. void func(int* t)
  4. {
  5. t = new int;
  6. }
  7. int main()
  8. {
  9. int* test =NULL;
  10. func(test);
  11. delete test;
  12. system("pause");
  13. return 0;
  14. }

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

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

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


  
  1. void func(int** t)
  2. {
  3. *t = new int;
  4. }
  5. <pre class="cpp" name="code">int main()
  6. {
  7. int* test =NULL;
  8. func(&test);
  9. delete test;
  10. system("pause");
  11. return 0;
  12. }


int*& t


  
  1. void func(int* &t)
  2. {
  3. t = new int;
  4. }
  5. int main()
  6. {
  7. int* test =NULL;
  8. func(test);
  9. delete test;
  10. system("pause");
  11. return 0;
  12. }
int* func()

  
  1. int* func()
  2. {
  3. int* t = new int;
  4. return t;
  5. }
  6. int main()
  7. {
  8. int* test =func();
  9. delete test;
  10. system("pause");
  11. return 0;
  12. }

 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/51813234

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。