我有以下c ++类
class Object
{
public:
Object(parameters);
...
const Object& method1(parameters) const;
Object& method2(parameters) const;
private:
}
method1
和method2
实现是:
const Object& Object::method1(parameters) const
{
...
Object* _obj = new Object;
...
return *_obj;
}
Object& Object::method2(parameters) const
{
...
Object* _obj = new Object;
...
return *_obj;
}
我还没有定义复制构造函数。我知道函数返回对已分配对象的引用,我仍然需要使用“delete”来删除它。 我想避免浪费内存并保护信息隐藏。
这是正确的方法,还是我错过了什么?
答案 0 :(得分:4)
这很糟糕,因为没有任何东西可以删除对象。他们将被泄露。
返回智能指针,不重新创建对象的副本或原始指针。
答案 1 :(得分:4)
这取决于类,但返回引用 动态分配的对象可能不是一个好主意。
如果类具有值语义(支持copy和 赋值),你应该返回一个实际的对象;动态 应避免使用值语义分配对象。
如果该类是一个完整的实体对象,其生命周期 由应用程序管理,你应该返回一个raw 指针。
如果返回的对象在此之前仍需要更多处理
将由应用程序管理,您应该返回
std::auto_ptr
,或者如果你可以使用C ++ 11,std::unique_ptr
;该
然后,一旦应用程序逻辑采用,调用者就会释放它
结果,如果在此期间发生任何事情,对象将会
自动被破坏并释放记忆。
答案 2 :(得分:2)
如果您使用的是C ++ 11,则可以使用std::unique_ptr<object>
或std::shared_ptr<object>
作为返回类型(具体取决于用例)。一旦最后一个智能指针消失,该对象将自动被破坏。
如果编译器不支持C ++ 11,这些类也可以在boost(std::unique_ptr
映射到boost::scoped_ptr
)中使用。如果需要,您也可以使用std::auto_ptr
,但C ++ 11已弃用它。
答案 3 :(得分:1)
在这种情况下,您应该使用返回值作为指针object* object::methodn(parameters) const
或实现复制构造函数,然后不返回引用而是返回对象的副本,因为当您查看method1
的声明或method2
你甚至无法想象内部是否存在内存泄漏。此外,如果您使用的是C ++ 11,则可以使用rvalue reference
使用复制构造函数here's some info on C++11 rvalue references