• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 浅谈返回函数内部new分配的内存的引用

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了浅谈二次函数,浅谈函数的一致连续性,浅谈三角函数,浅谈一次函数,浅谈涨停板的操作等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

lz是这样问的:

按照这句话,

string& foo()
{
string* str = new string("abc");
return *str; 
}
</div>

非法的,为什么?

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

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

struct a_s
{
int a;
};

a_s* foo()
{
  struct a_s* sp = new struct a_s;
  return sp;
}
</div>

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

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

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

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

只能这样:

string& tmp = foo();
string str = tmp; 
delete &tmp;
</div>

这样就不会造成内存泄露了。 但是每次的这样就是谁都觉得烦。而且暗藏杀机啊,比如: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;
}
</div>

运行结果如下:

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

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

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈返回函数内部new分配的内存的引用
  • 浅谈在函数中返回动态的内存
  • 浅谈C++中虚函数实现原理揭秘
  • 浅谈C++中的构造函数分类及调用规则

相关文章

  • 2017-05-28C++实现调用系统时间简单示例
  • 2017-05-28详解 linux c++的编译器g++的基本使用
  • 2017-05-28给ActiveX签名的实现方法详解
  • 2017-05-28C语言中多维数组的内存分配和释放(malloc与free)的方法
  • 2017-05-28C++中Operator类型强制转换成员函数解析
  • 2017-05-28关于双向链表的增删改查和排序的C++实现
  • 2017-05-28详解C语言sscanf()函数、vsscanf()函数、vscanf()函数
  • 2017-05-28C语言实现输入一个字符串后打印出该字符串中字符的所有排列
  • 2017-05-28C语言的Struct Hack笔记
  • 2017-05-28关于memcpy和memmove的一点重要说明

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++中的Lambda表达式详解
    • win32使用openfilename浏览文件窗口示例
    • C++输入输出注意事项总结
    • 海量数据处理系列之:用C++实现Bitmap算法
    • C语言中send()函数和sendto()函数的使用方法
    • 关于c语言指针的两处小tip分享
    • C++自定义函数判断某年某月某日是这一年中第几天
    • 实例解析C++中类的成员函数指针
    • 6个变态的C语言Hello World程序
    • do...while(0)的妙用详细解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有