Chr*_*don 6 c++ pointers reference
我知道有类似的问题,但没有一个给我一个明确的答案...
在最佳实践方面,这些都可以吗?或者我应该返回一个指针?如果不是,他们应该如何改变以遵循最佳实践.
我想从函数返回对新对象的引用.我的实施如下:
MyClass& doSomething() {
   return *(new MyClass());
}
MyClass a = doSomething();
这是否可以,因为在新的堆上分配了一个新的MyClass实例?
或者我应该保持不变(我不确定何时这样做)?
const MyClass& doSomething() {
    return *(new MyClass());
}
如果这两个都错了,我应该只返回一个指向新对象的指针吗?
谢谢.
虽然这不完全无效,但这不是一个好主意.
MyClass& doSomething() {
   return *(new MyClass());
}
你返回后,没有人有原始指针,所以没有人会delete这样.*所以这是一个内存泄漏.
new除非你有一个相应的delete-or,更好的智能指针构造函数,否则你几乎不应该写一个.
同时,您的原始代码中的这一行:
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那个.你很可能不会这样做,而且看起来很尴尬.如果你想传递指针,传递指针.如果您不想传递指针,请在类中包装所有权并按值传递类.
**通过"易于复制",我的意思是很容易安全地复制它们,而且实际上是这样做的.例如,原始指针或文件句柄只是几个字节,默认的复制构造函数很乐意为你复制它们......但是你最终会对同一个堆对象或文件进行多次引用,并且无法跟踪谁负责删除或关闭它.
| 归档时间: | 
 | 
| 查看次数: | 7057 次 | 
| 最近记录: |