在C ++中,动态分配单个类的最佳方法是什么?

问题描述

SomeClass* a = new SomeClass;

很简单,但是我听说std::vector比new更可取。但是,

std::vector<SomeClass> a(1);

也感到很奇怪,因为当我使用a[0]时,尚不清楚我是将其用作变量而不是数组。这没有什么问题吗,还是有更好的方法呢?

编辑:我特别想做的是在一个函数中创建一个类实例,并在不复制它的情况下将其返回。

编辑:将int更改为SomeClass。

解决方法

如果要动态分配类的实例,请使用智能指针:std::unique_ptrstd::shared_ptr,它们可以分别通过make_uniquemake_shared来构造。

还有一些库可以使用其他智能指针。

如果要分配int ...我的意思是可能有原因,但是通常您应该在堆栈中保留这么小的内容。

,

或者有更好的方法吗?

当然,有更好的方法,只要我们谈论原始类型或小型类/结构:就不要。

您始终可以在堆栈上执行此操作,我看不出您需要通过动态内存分配执行此操作的任何原因(除非出于某些深奥的原因,这仅表明一些严重的设计缺陷)。


关于OP关于类/结构的评论:

  1. 如果一个类的成员数量增加到很大,那么将其分配到堆栈上可能会出现问题,最好更改内部类的设计以在内部进行动态分配(例如,更改一个大的std::array<T,HUGEVAL>成员变量)到std::vector<T>)。
  2. 或者,如果您确实决定不这样做,或者无法更改类,则更喜欢使用std::vector。手动使用newdelete太容易出错,应绝对避免。使用std::vector几乎没有开销,并且如果您的硬件如此有限,以至于无法承受这么小的开销,那么在大多数情况下,动态内存分配将始终无法使用。
  3. 正如OP在评论中指出的那样,他们想了解类或结构变量的情况:c ++标准提供了std::unique_ptrstd::shared_ptr,可用于保存和管理单个动态分配的变量类型实例,而无需支付std::vector开销。

至于OP编辑(重点是我):

我特别想做的是在函数中创建一个类实例,并不复制它而将其返回

return上进行的复制。现代的c ++编译器支持RVO(返回值优化),可以有效地移动返回的值(另请参见:Is RVO (Return Value Optimization) applicable for all objects?)。