繁体   English   中英

C ++返回对新对象的引用

[英]C++ Returning Reference to New Object

我知道有类似的问题,但没有一个给我一个明确的答案...

在最佳实践方面,这些都可以吗? 或者我应该返回一个指针? 如果不是,他们应该如何改变以遵循最佳实践。

我想从函数返回对新对象的引用。 我的实施如下:

MyClass& doSomething() {
   return *(new MyClass());
}

MyClass a = doSomething();

这是否可以,因为在新的堆上分配了一个新的MyClass实例?

或者我应该保持不变(我不确定何时这样做)?

const MyClass& doSomething() {
    return *(new MyClass());
}

如果这两个都错了,我应该只返回指向新对象的指针吗?

谢谢。

虽然这不完全无效,但这不是一个好主意。

MyClass& doSomething() {
   return *(new MyClass());
}

返回后,没有人有原始指针,所以没有人会delete它。*所以这是一个内存泄漏。

你几乎不应该写一个new除非你有一个相应的delete - 或更好,一个智能指针构造函数。


同时,您的原始代码中的这一行:

MyClass a = doSomething();

...无论如何都会复制价值。 假设这不是另一个必须修复的bug,为什么还要分配一个对象并返回一个复制和泄漏的引用呢? 只需按值返回对象:

MyClass doSomething() {
   return MyClass();
}

现在您不必担心删除任何内容,因为您从未在堆上创建任何内容。


最佳实践通常可以用四个字母RAII来概括:资源获取是初始化。 (并且必然,破坏就是释放。)如果你有一些不可能或昂贵的东西要按值传递,那么按价值传递一些句柄。 例如:

unique_ptr<MyClass> doSomething() {
    return unique_ptr<MyClass>(new myClass());
}

unique_ptr<MyClass> a = doSomething();

现在它只是一个被复制的指针。 对象本身已被内部创建doSomething ,并删除每当a超出范围(或者,如果你把它传递到另一个变量, 每当超出范围,等等)。

另一方面,如果MyClass只是少数易于复制的值**,那就复制一下吧。


*这不是不可能永远删除; 你总是可以指向引用并delete它。 你很可能不会这样做,而且看起来很尴尬。 如果你想传递指针,传递指针。 如果您不想传递指针,请在类中包装所有权并按值传递类。

**通过“易于复制”,我的意思是很容易安全地复制它们,而且实际上是这样做的。 例如,原始指针或文件句柄只是几个字节,默认的复制构造函数很乐意为你复制它们......但是你最终会对同一个堆对象或文件进行多次引用,并且无法跟踪谁负责删除或关闭它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM