问题描述
SomeClass* a = new SomeClass;
很简单,但是我听说std::vector
比new更可取。但是,
std::vector<SomeClass> a(1);
也感到很奇怪,因为当我使用a[0]
时,尚不清楚我是将其用作变量而不是数组。这没有什么问题吗,还是有更好的方法呢?
编辑:我特别想做的是在一个函数中创建一个类实例,并在不复制它的情况下将其返回。
编辑:将int更改为SomeClass。
解决方法
如果要动态分配类的实例,请使用智能指针:std::unique_ptr
或std::shared_ptr
,它们可以分别通过make_unique
和make_shared
来构造。
还有一些库可以使用其他智能指针。
如果要分配int
...我的意思是可能有原因,但是通常您应该在堆栈中保留这么小的内容。
或者有更好的方法吗?
当然,有更好的方法,只要我们谈论原始类型或小型类/结构:就不要。
您始终可以在堆栈上执行此操作,我看不出您需要通过动态内存分配执行此操作的任何原因(除非出于某些深奥的原因,这仅表明一些严重的设计缺陷)。
关于OP关于类/结构的评论:
- 如果一个类的成员数量增加到很大,那么将其分配到堆栈上可能会出现问题,最好更改内部类的设计以在内部进行动态分配(例如,更改一个大的
std::array<T,HUGEVAL>
成员变量)到std::vector<T>
)。 - 或者,如果您确实决定不这样做,或者无法更改类,则更喜欢使用
std::vector
。手动使用new
和delete
太容易出错,应绝对避免。使用std::vector
几乎没有开销,并且如果您的硬件如此有限,以至于无法承受这么小的开销,那么在大多数情况下,动态内存分配将始终无法使用。 - 正如OP在评论中指出的那样,他们想了解类或结构变量的情况:c ++标准提供了
std::unique_ptr
和std::shared_ptr
,可用于保存和管理单个动态分配的变量类型实例,而无需支付std::vector
开销。
至于OP编辑(重点是我):
我特别想做的是在函数中创建一个类实例,并不复制它而将其返回。
return上进行的复制。现代的c ++编译器支持RVO(返回值优化),可以有效地移动返回的值(另请参见:Is RVO (Return Value Optimization) applicable for all objects?)。