类内返回从堆分配的指针合理吗?在线等。(高手进!!!)

fengfeng2003 2004-12-28 11:17:41
以前看effective c++时记得有一条是这样说的:

不要从类内返回堆上分配的指针。

也也就是说

class aClass
{
public:
int* fun()
{
new int;
}

}

也就是说上面的类设计的不好,很容易造成内存泄漏,因为使用这个类的程序员必须在调用fun函数后记得释放内存。

但是这几天研究CppUnit的源代码,却发现很多从类内返回堆分配的指针的例子
比如Test是由TestFactory创建的(用new分配的内存),但是内存的释放却是由Testsuite类来完成,
还有有很多这样的例子。

CppUnit使用的大量的设计模式,用了大量的指针,是不是使用设计模式就必须象CppUnit这样分配和释放内存?但这是和Effective上的条款是违背的啊!!!而且也确实比较容易混乱,你在这个类分配内存,却必须在另一个类释放。

小弟一直迷惑的地方。请高手解答。多谢!!!
...全文
607 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
classrect 2005-01-13
  • 打赏
  • 举报
回复
up!
fengfeng2003 2005-01-13
  • 打赏
  • 举报
回复
up
yuanyou 2005-01-12
  • 打赏
  • 举报
回复
up
fengfeng2003 2005-01-12
  • 打赏
  • 举报
回复
up
MeHawk 2005-01-05
  • 打赏
  • 举报
回复
无所谓,只有一个原则是必须的,就是new和delete应该配套使用,只要你的代码这样做了,采用什么方式new都无所谓。不过你的类是给别人用的,那么你能保证别人知道需要delete吗?
healer_kx 2005-01-05
  • 打赏
  • 举报
回复
合理, 怎么不合理?

new重载是干吗的? 不久是干这个的?
zhangqiushuang 2005-01-05
  • 打赏
  • 举报
回复
做个不恰当的比喻,用不可降解的垃圾袋是污染环境的,就象new一个指针之后没有相应的del。而要是可降解的垃圾袋是没事的。
如前,你要是在封装了new之后没有把del封装进去,那当然是不对的。可是把del也封装进去,那就不是不会有什么内存泄露了吗?
classrect 2005-01-05
  • 打赏
  • 举报
回复
恩!楼上的观点我基本同意!!!!!!

我觉得如果封装了new ,那么最好封装delete
就向前边的一个兄弟提到的:

void *create(int n)
{
return (void *)new char[n];
}
void free(void *p)
{
delete[] (char*)p;
}

这样从程序风格讲比直接
p = create(n);
delete[] p;
强!!!!!!!
xiaolizi 2005-01-04
  • 打赏
  • 举报
回复
我来反草流一下,大家来bs我吧^_^

我个人觉得,这个问题是完全合乎使用规范的,任何教条化的经验都是不可取的,包括上面提到的Effective条款,这些对于我们初学者来说是正确的,应该避免的,但是不是绝对的。当对语言理解达到一定深度就不应该被此类问题所困惑和束搏。dj思酷拉建议不要使用goto语句,但实践中我个人觉得goto语句真是太好用了,它让我从N多个return语句回归到了一个return,它让我从N层判断和循环中直接跳出到我需要去的地方。这里的问题也是类似,如果说不应该从类中返回堆上的对象,那么COM就无法实现,COM返回的对象还是要我们自己来Release,同样,楼上的朋友提到的句柄也是如此。所以实践是最好的老师,任何条款,经验都是相对的,具有一定的局限性,不要让这些束搏了我们的思维和创造力。

个人观点啊。^_^
tjuzhangrui 2005-01-04
  • 打赏
  • 举报
回复
mark
xunfengxxx 2005-01-04
  • 打赏
  • 举报
回复
C++比起java 来这点不是很好!
xunfengxxx 2005-01-04
  • 打赏
  • 举报
回复
这种问题确实很麻烦,
函数返回指针
分为两种情况(自己的个人观点)
int *
char *
强者在堆上返回的话
我个人认为的确能找到指针所指的的首地址,但是为何int数组不能自动测其长度呢?
好象没有intstrlen的函数吧?
所以指针无法确定内存的区域
所以可以用静态变量或者指针的指针解决
而char *则不存在这个问题
fengfeng2003 2005-01-04
  • 打赏
  • 举报
回复
up
漂流的代码 2005-01-01
  • 打赏
  • 举报
回复
如果大家用过API的话,想必对HANDLE不陌生吧
在windows中,HABDLE 是typedef void*
有很多的API函数都返回一个句柄,如CreateFile
用完之后,就CloseHandle,
我没有见过windows的 原代码,但是可以肯定,windowsAPI分配了内存
给这些句柄特定结构使用。
我们知道,不管是什么库,只要在windows平台下,免不了对API封状,所以,这里
的大多数朋友一编写程序,就免不了使用这种内部分配内存的方法。
关键不是别的,是规则
漂流的代码 2005-01-01
  • 打赏
  • 举报
回复
一般的规则是谁分配,谁释放。
函数当然可以返回从堆分配的指针,C/C++语法不禁止
但是,要记得释放
一般都是写一对函数:
如:
void *create(int n)
{
return (void *)new char[n];
}
void free(void *p)
{
delete[] (char*)p
}
dongpy 2005-01-01
  • 打赏
  • 举报
回复
To fengfeng2003():
我觉得在自己程序内部,这样做是可以的.只要确保安全释放.
baqiao1211 2005-01-01
  • 打赏
  • 举报
回复
mark
classrect 2004-12-30
  • 打赏
  • 举报
回复
to bill_li(大超) :

那您如何实现工厂方法?
fengfeng2003 2004-12-30
  • 打赏
  • 举报
回复
up
classrect 2004-12-29
  • 打赏
  • 举报
回复
顶一下,期待高手!!!
加载更多回复(34)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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