时间:2021-05-19
在bbs看到了一个帖子:为什么不能返回函数内部new分配的内存的引用?
lz是这样问的:
按照这句话,
非法的,为什么?
其实,不能说这是非法的,只能说这种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分配的内存的引用全部内容了,希望大家多多支持~
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
CLR支持两种类型:引用类型和值类型。引用类型总是从托管堆上分配的。c#中的New操作符返回对象的内存地址。引用对象的注意点:1、内存从托管堆中分配2、堆上分配
1.概述通过构造函数创建对象,有时忘记了写new,这时函数就会返回undefined可以创建一个函数createXXX,在内部封装new。functionStu
new运算符用作从自由存储为type-name的对象或对象数组分配内存,并将已适当分类的非零指针返回到对象。[::]new[placement]new-type
C++支持使用new和delete运算符动态分配和释放对象。这些运算符为来自称为“自由存储”的池中的对象分配内存。new运算符调用特殊函数operatornew
C++告诉我们在回收用new分配的单个对象的内存空间的时候用delete,回收用new[]分配的一组对象的内存空间的时候用delete[]。关于new[]和de