浅谈返回函数内部new分配的内存的引用

 更新时间:2016年12月22日 09:49:50   投稿:jingxian  
下面小编就为大家带来一篇浅谈返回函数内部new分配的内存的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在bbs看到了一个帖子:为什么不能返回函数内部new分配的内存的引用?

lz是这样问的:

按照这句话,

string& foo()
{
string* str = new string("abc");
return *str; 
}

非法的,为什么?

其实,不能说这是非法的,只能说这种u编程习惯很不好,这样很可能造成内存泄露。

后面还有个回复是这样的:

struct a_s
{
int a;
};

a_s* foo()
{
  struct a_s* sp = new struct a_s;
  return sp;
}

这个挺好啊,为什么换成reference就泄漏了?

不能说这样写就挺好,这样写跟lz写的都是一个道理,也并不是说这样写就内存泄露了,只是说,这样写很容易造成内存泄露。程序员在编写代码时,为了避免内存泄露,必须保证对每个用new产生的指针调用delete释放。

如果按照以上两种做法,即使很小心的程序员也难免会造成内存泄露。

比如:string str = foo(); 显然new生成的这块内存将无法释放。

只能这样:

string& tmp = foo();
string str = tmp; 
delete &tmp;

这样就不会造成内存泄露了。 但是每次的这样就是谁都觉得烦。而且暗藏杀机啊,比如:string str = "hello" + foo(); 上式不知不觉就造成内存泄露了。所以,即使很小心的程序员也难免会造成内存泄露。

为了证明我的思想,我写了测试代码:(vs2008调式通过)

#include <iostream>
using namespace std;
class example
{
public:
example()
{
  num = new int;
  *num = 10;
  cout<<"num = "<<*num<<endl;
  cout<<"构造"<<endl;
}
~example()
{
  cout<<"析构"<<endl;
  delete num;
}
void pingfang()
{
  *num *= *num;
}
void print()
{
  cout<<*num<<endl;
}
private:
int *num;
};

example & diaoyong1()
{
example * p = new example;
p->pingfang();
return *p;
}

example * diaoyong2()
{
example * p = new example;
p->pingfang();
return p;
}

int main(void)
{
example & e1 = diaoyong1();
e1.print();
delete &e1;
example * ptr = diaoyong2();
ptr->print();
delete ptr;
getchar();
return 0;
}

运行结果如下:

num = 10
构造
100
析构
num = 10
构造
100
析构

从运行结果来看:我的结论如下:

并不是说返回函数内存new分配的内存的引用或指针是非法的,只是说如果要返回,必须要十分注意,因为很有可能造成内存泄露。所以一般不提倡返回函数内存new分配的内存的引用或指针。

以上就是小编为大家带来的浅谈返回函数内部new分配的内存的引用全部内容了,希望大家多多支持脚本之家~

相关文章

  • 实现opencv图像裁剪分屏显示示例

    实现opencv图像裁剪分屏显示示例

    这篇文章主要介绍了实现opencv图像裁剪分屏显示示例,需要的朋友可以参考下
    2014-04-04
  • C++内存管理详细解析

    C++内存管理详细解析

    这篇文章主要给大家分享的是C++内存管理的详细内容学习,下面文章围绕C++内存管理的相关资料展开具体学习内容,需要的朋友可以参考一下,希望对你有所帮助
    2021-11-11
  • 一文弄懂c语言赋值截断

    一文弄懂c语言赋值截断

    截断是指将一个较宽范围的整型赋值给一个较窄范围的整型时,超出目标类型表示范围的部分被丢弃,只保留目标类型能够表示的部分,本文主要介绍了c语言赋值截断,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • C语言中bool和float的用法实例解析

    C语言中bool和float的用法实例解析

    这篇文章主要介绍了C语言中bool类型和float类型的相关资料,bool类型用于声明布尔变量,只有true和false两种值,float类型用于存储单精度浮点数,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • 一文详解C语言中文件相关函数的使用

    一文详解C语言中文件相关函数的使用

    这篇文章主要为大家详细介绍了C语言中文件相关函数的使用,可以实现文件的读写、打开和关闭。文中通过示例进行了详细介绍,需要的可以参考一下
    2022-07-07
  • 谈谈C++学习之Pair的使用方法

    谈谈C++学习之Pair的使用方法

    pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,本篇详细的介绍了Pair的使用方法和实例,有兴趣的同学可以了解一下。
    2016-12-12
  • stl容器set,map,vector之erase用法与返回值详细解析

    stl容器set,map,vector之erase用法与返回值详细解析

    在使用 list、set 或 map遍历删除某些元素时可以这样使用,如下所示
    2013-09-09
  • C++11 lambda(匿名函数)表达式详细介绍

    C++11 lambda(匿名函数)表达式详细介绍

    lambda 表达式(lambda expression)是一个匿名函数,C++11中的lambda表达式用于定义并创建匿名的函数对象,以简化编程工作,下面这篇文章主要给大家介绍了关于C++11 lambda(匿名函数)表达式的相关资料,需要的朋友可以参考下
    2022-07-07
  • C++与Lua交互内存分配详解

    C++与Lua交互内存分配详解

    C/C++ 与 Lua 的交互是通过 lua_State 这一句柄进行交互,我们常规的创建都是通过 luaL_newstate 这一辅助函数,这篇文章主要给大家详细介绍了C++与Lua交互内存分配,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • C++ set的使用方法详解

    C++ set的使用方法详解

    这篇文章主要介绍了C++ set的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握set的使用方法,需要的朋友可以参考下
    2017-10-10

最新评论