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

In C++, what is the best way to dynamically allocate a single class?

SomeClass* a = new SomeClass;

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

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

也感觉怪怪的,因为当我使用a[0]的时候,不清楚我是把它当作变量而不是数组来使用。这样做有什么问题吗,或者有更好的方法吗?

编辑:我特别想做的是在函数中创建一个 class 实例并 return 它而不复制它。

编辑:更改为 SomeClass。

or is there a better way to do this?

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

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


关于 OP 关于 classes / structs 的评论:

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

至于 OP 编辑​​(强调我的):

What I specifically want to do is to create a class instance in a function and return it without copying it.

无需担心在 return 上从函数创建的副本。现代 c++ 编译器支持 RVO(return 值优化),它有效地移动了 returned 值(另请参见:Is RVO (Return Value Optimization) applicable for all objects?)。

如果您想动态分配 class 的实例,则使用智能指针:std::unique_ptrstd::shared_ptr 可通过 make_unique 和 [=13 构造=]分别。

还有包含您可以使用的其他智能指针的库。

万一分配一个int...我的意思是可能有原因,但通常你应该只在堆栈上保留这么小的东西。