在 C++ 中,动态分配单个类的最佳方法是啥? [关闭]

Posted

技术标签:

【中文标题】在 C++ 中,动态分配单个类的最佳方法是啥? [关闭]【英文标题】:In C++, what is the best way to dynamically allocate a single class? [closed]在 C++ 中,动态分配单个类的最佳方法是什么? [关闭] 【发布时间】:2020-12-31 06:43:27 【问题描述】:
SomeClass* a = new SomeClass;

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

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

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

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

编辑:将 int 更改为 SomeClass。

【问题讨论】:

反问:为什么想要或需要动态分配单个变量? YAGNI 是唯一正确的答案。 好的,我应该更具体一点——如何动态分配单个类? std::make_unique? std::unique_ptr&lt;int&gt; 你不需要用这种方式来更新/释放自己。 使用std::unique_ptrstd::shared_ptr 【参考方案1】:

或者有更好的方法吗?

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

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


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

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

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

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

不必担心从函数对return 进行的复制。现代 c++ 编译器支持 RVO(返回值优化),它可以有效地移动返回值(另请参阅:Is RVO (Return Value Optimization) applicable for all objects?)。

【讨论】:

也许我想在函数中返回一个类,而不想复制整个东西?如果我误解了什么,请纠正我。 @ssamtkwon 关于退货的情况,一般不用担心。我们有 RVO(返回值优化),它将有效地移动值,而不是复制它。【参考方案2】:

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

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

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

【讨论】:

以上是关于在 C++ 中,动态分配单个类的最佳方法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以防止类的动态分配?

在单个查询中从他们的 ID 获取相关数据的最佳方法是啥?

构建应用程序以在单个 UITableView 中显示两个列表的最佳方法是啥(在数据集之间切换)

从 Groovy 中的 Set 中提取单个值的最佳方法是啥?

通过 OleDbConnection 获取单个记录的最佳方法是啥?

存储数据列表并自动分配给结构的最佳方法是啥