这个问题 困扰了 我很长时间,现在征求解答 :
下面是模拟代码
代码1:
代码 2:
代码2 不会内存泄漏,但传递整个对象,效率要差。
当然还有方法可以把代码1返回的指针用智能指针 包装,使之返回auto_ptr 或shared_ptr,但智能指针也有些其他问题,用起来不如真实指针好用。
还有 一种 方法是返回引用,这个方法当然就更不行了,更容易出现空引用和内存泄漏的事情。还不如指针!
请大家看看,在这种情况下,大家都采用哪种方式 ?代码1还是 代码2 。
毫无疑问,第一种好。
一:效率
二:如果直接传对象的话,很容易出现在对象切割( http://hi.baidu.com/anglecloudy/blog/item/88326a344b82c4b0d0a2d31a .html
)这个恶心的问题。指针就不会
三:符合面向对象思想,对多态的实现有利
显然第一种好,第二种要多次拷贝对象,如4楼所说。
主要还是看你要返回的对象到底多大,如果合适,当然可以返回对象了。
各有千秋!
第一种方式,注重效率,但在函数内部new,函数外部delete,被认为是糟糕的函数接口设计。
第二种方式,多了两次拷贝的时间消耗,但接口设计比第一种好。
选择什么,看你的应用需求了。
经常用就1,效率但要注意安全,不经常用比如就调一次,那么2吧,1累。
一般是用方案1,但不是绝对。有些情况只能用方案2。详细信息可以参见Effective C++,条款22: 尽量用“传引用”而不用“传值”。
通常返回指针好一些,这也没有绝对标准,如果你你的程序对安全要求很高而又不太注重效率的话可以考虑对象,否则还是建议返回指针,在内存管理上多用些精力
下面是模拟代码
代码1:
-
C/C++ code
- FileElement * FolderElement::GetSingleFile(LPCTSTR fileName) const
-
{ -
......
-
FileElement * pFile = new FileElement(....);
-
......... -
return pFile;
-
}
代码 2:
-
C/C++ code
-
FileElement FolderElement::GetSingleFile(LPCTSTR fileName)
const
-
{
-
......
-
FileElement pFile = FileElement(....); -
......... -
return pFile;
- }
代码2 不会内存泄漏,但传递整个对象,效率要差。
当然还有方法可以把代码1返回的指针用智能指针 包装,使之返回auto_ptr 或shared_ptr,但智能指针也有些其他问题,用起来不如真实指针好用。
还有 一种 方法是返回引用,这个方法当然就更不行了,更容易出现空引用和内存泄漏的事情。还不如指针!
请大家看看,在这种情况下,大家都采用哪种方式 ?代码1还是 代码2 。
毫无疑问,第一种好。
一:效率
二:如果直接传对象的话,很容易出现在对象切割( http://hi.baidu.com/anglecloudy/blog/item/88326a344b82c4b0d0a2d31a
三:符合面向对象思想,对多态的实现有利
显然第一种好,第二种要多次拷贝对象,如4楼所说。
主要还是看你要返回的对象到底多大,如果合适,当然可以返回对象了。
各有千秋!
第一种方式,注重效率,但在函数内部new,函数外部delete,被认为是糟糕的函数接口设计。
第二种方式,多了两次拷贝的时间消耗,但接口设计比第一种好。
选择什么,看你的应用需求了。
经常用就1,效率但要注意安全,不经常用比如就调一次,那么2吧,1累。
一般是用方案1,但不是绝对。有些情况只能用方案2。详细信息可以参见Effective C++,条款22: 尽量用“传引用”而不用“传值”。
通常返回指针好一些,这也没有绝对标准,如果你你的程序对安全要求很高而又不太注重效率的话可以考虑对象,否则还是建议返回指针,在内存管理上多用些精力