为什么不允许函数以值返回动态对象why!

nothing707 2003-02-26 12:53:44
真的不可以让函数的值返回动态对象吗?
TClass function()
{
TClass *p = new TClass;
...
return *p;
}
不是挺好的吗? 有何不妥?
...全文
84 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
maurice1983 2003-02-27
  • 打赏
  • 举报
回复
TClass* function()
{
TClass *p = new TClass;
...
return p;
}
我比较赞同这种改法!简单明了!
你的那种写法一定会漏内存!
wshcdr 2003-02-26
  • 打赏
  • 举报
回复
chinajiji(菜鸟叽叽)不是一般的强啊!
chinajiji 2003-02-26
  • 打赏
  • 举报
回复
真的不可以让函数的值返回动态对象吗?
TClass function()
{
TClass *p = new TClass;
...
return *p;
}
不是挺好的吗? 有何不妥?
你的方法: 内存泄漏无法避免.
因为funtion返回后,p消失,无法delete;

改一:


TClass* function()
{
TClass *p = new TClass;
...
return p;
}
TClass *pT = funtion();
....
delete pT;

改二:

TClass& function()
{
TClass *p = new TClass;
...
return *p;
}

TClass &rT = function;
....
TClass *p = &rT;
delete p;

改三:

std::auto_ptr<TClass> function()
{
std::auto_ptr<TClass> auto_pT(new TClass);
return auto_pTp;
}
std::auto_ptr<TClass> auto_pTClass = funtion();
//delete is not required now;
改五:


TClass* function()
{
static TClass obj;
...
return &obj;
}

改六:

TClass function()
{
TClass obj;
...
return obj;
}






sea_lover 2003-02-26
  • 打赏
  • 举报
回复
可以返回!
#include <iostream>
class object
{
private:
char *ch;
public:
object(){ch=new char[20];}
~object(){delete[] ch;}
char *function();
};
char *object :: function()
{
ch="fdsafdas";
return ch;
}

void main()
{
object a;
char *aa;
aa=a.function();
}
简单写的!不知道符不符合你的要求!




-----------------------------------------
【◇SeaLover◆〗
/ \
★---CSDN---☆
 \ /
【○Trust Me●〗
flysundy 2003-02-26
  • 打赏
  • 举报
回复
学习,auto_ptr?
acange 2003-02-26
  • 打赏
  • 举报
回复
TClass function()
{
TClass *p = new TClass;
...
return *p;
}

你这样是可以的, 因为这个内存块是在堆上分配的, 这个内存一直存在到你delete到他为止。

但你要小心, 如果你在你的function里面分配的是栈上的地址的话, 那就会有麻烦了。比如
char* function()
{
char p[100];
p[100]="from stack";
return p;
}
这个p[100]里面的内容会在函数返回前被清空, 所以千万不要这样。

象菜鸟jiji说的, 你这样作的不好之处事, 以后管理不好, 谁知道你这个内存快是 new 的,还是 malloc, 或者别的。。为了解决这个内存管理的问题你可以用auto_ptr.
Flamesong 2003-02-26
  • 打赏
  • 举报
回复
chinajiji(菜鸟叽叽)牛,老牛。楼主结帖吧!
Zark 2003-02-26
  • 打赏
  • 举报
回复
这样的代码
TClass function()
{
TClass *p = new TClass;
...
return *p;
}
是不妥的,其原因是p所指的堆内存将无法释放.不信?!你试试在哪里加一个delete能释放那块内存?

yatuor 2003-02-26
  • 打赏
  • 举报
回复
改五强,亏你想得出来
改六朴实无华最好
yatuor 2003-02-26
  • 打赏
  • 举报
回复
你说的对,返回对象指针只能在自己写的程序中用,不能给别人调用的。
比如说链表的插入就是这样的
请教一下:auto_ptr是什么意思,怎么用
chinajiji 2003-02-26
  • 打赏
  • 举报
回复
当然可以,问题是返回一个对象的指针在内存管理上在点麻烦,就是:这个返回的指针别人真知道一定是new出来的?如果是,什么时候delete呢?
为了解决这个内存管理的问题你可以用auto_ptr.
yatuor 2003-02-26
  • 打赏
  • 举报
回复
事实上是可以的,没人说不可以阿。
不过最好是这样
TClass* function()
{
TClass *p = new TClass;
...
return p;
}
如果按你的写法,返回的是一个对象,不好使用,
比如说
TClass a;
a=function();
调用了TClass拷贝构造函数。
TClass a;
//...
a=function();
调用了TClass‘='操作符。
用户 昵称 2003-02-26
  • 打赏
  • 举报
回复
局部的指针,外面消失了。
hot1985 2003-02-26
  • 打赏
  • 举报
回复
mark
引言: 通过Vue构造器传入的各种选项大多数都可以在组件里用,唯独只有data选项有区别,在Vue构造器中data返回的是对象,但是在组建中必须返回一个函数。why?先来看下面一个例子:HTML:

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧