在 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 的评论:
- 如果 class 成员增长那么大,在堆栈上分配它可能会有问题,最好更改内部 class 设计以在内部进行动态分配(例如将一个大的
std::array<T,HUGEVAL>
成员变量更改为 std::vector<T>
).
- 或者,如果您真的决定不这样做,或者无法更改 class,则更喜欢使用
std::vector
。手动使用 new
和 delete
太容易出错,应无论如何避免。使用 std::vector
几乎没有开销,如果您的硬件非常有限,它无法承受那么小的开销,动态内存分配无论如何在大多数情况下都不可用。
- 正如 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_ptr
或 std::shared_ptr
可通过 make_unique
和 [=13 构造=]分别。
还有包含您可以使用的其他智能指针的库。
万一分配一个int
...我的意思是可能有原因,但通常你应该只在堆栈上保留这么小的东西。
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 的评论:
- 如果 class 成员增长那么大,在堆栈上分配它可能会有问题,最好更改内部 class 设计以在内部进行动态分配(例如将一个大的
std::array<T,HUGEVAL>
成员变量更改为std::vector<T>
). - 或者,如果您真的决定不这样做,或者无法更改 class,则更喜欢使用
std::vector
。手动使用new
和delete
太容易出错,应无论如何避免。使用std::vector
几乎没有开销,如果您的硬件非常有限,它无法承受那么小的开销,动态内存分配无论如何在大多数情况下都不可用。 - 正如 OP 在评论中指出的那样,他们想了解 class 或结构变量的情况:C++ 标准提供
std::unique_ptr
andstd::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_ptr
或 std::shared_ptr
可通过 make_unique
和 [=13 构造=]分别。
还有包含您可以使用的其他智能指针的库。
万一分配一个int
...我的意思是可能有原因,但通常你应该只在堆栈上保留这么小的东西。