在 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<int>
你不需要用这种方式来更新/释放自己。
使用std::unique_ptr
或std::shared_ptr
。
【参考方案1】:
或者有更好的方法吗?
当然,有一个更好的方法,只要我们谈论原始类型,或小类/结构:不要。
您始终可以在堆栈上执行此操作,我看不出您需要使用动态内存分配执行此操作的任何原因(除非有一些深奥的原因,这只会表明一些严重的设计缺陷)。
至于 OP 关于类/结构的评论:
-
如果一个类的成员增长到那么大,在堆栈上分配它可能会出现问题,最好更改内部类设计以在内部进行动态分配(例如,将一个大的
std::array<T,HUGEVAL>
成员变量更改为std::vector<T>
)。
或者,如果您真的决定不这样做,或者无法更改课程,则更喜欢使用std::vector
。手动使用new
和delete
太容易出错,应该尽量避免。使用std::vector
几乎没有任何开销,如果您的硬件非常有限,无法承受这么小的开销,那么在大多数情况下,动态内存分配无论如何都不可用。
正如 OP 在 cmets 中指出的那样,他们想了解类或结构变量的情况:c++ 标准提供了 std::unique_ptr
和 std::shared_ptr
,它们可用于保存和管理单个动态分配的类型实例,无需支付std::vector
开销。
至于 OP 编辑(强调我的):
我特别想做的是在函数中创建一个类实例并返回它而不复制它。
不必担心从函数对return
进行的复制。现代 c++ 编译器支持 RVO(返回值优化),它可以有效地移动返回值(另请参阅:Is RVO (Return Value Optimization) applicable for all objects?)。
【讨论】:
也许我想在函数中返回一个类,而不想复制整个东西?如果我误解了什么,请纠正我。 @ssamtkwon 关于退货的情况,一般不用担心。我们有 RVO(返回值优化),它将有效地移动值,而不是复制它。【参考方案2】:如果要动态分配类的实例,请使用智能指针:std::unique_ptr
或 std::shared_ptr
,它们分别可通过 make_unique
和 make_shared
构造。
您还可以使用带有其他智能指针的库。
如果分配 int
... 我的意思是可能有原因,但通常你应该在堆栈上保留这么小的东西。
【讨论】:
以上是关于在 C++ 中,动态分配单个类的最佳方法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
构建应用程序以在单个 UITableView 中显示两个列表的最佳方法是啥(在数据集之间切换)
从 Groovy 中的 Set 中提取单个值的最佳方法是啥?