【发布时间】:2022-01-06 16:35:32
【问题描述】:
如果我用
创建Foo
Foo* foo = new Foo();
然后重新分配foo
Foo mkfoo();
*foo = mkfoo();
我可以确定我已经为mkfoo 创建的这个新实例分配了足够的内存吗?即使Foo 具有动态大小的内容,例如std::vector 使用 mkfoo() 创建时的内容与使用 new Foo() 创建时的内容不同?如果不是,那么分配内存的最佳方式是什么?
【问题讨论】:
-
Foo类型的每个对象都具有完全相同的大小。这适用于所有类型。任何需要动态内存量的东西都需要使用动态内存分配,它存储在对象本身之外。 -
Foo类型的每个对象都具有相同的大小。std::vector<whatever>类型的每个对象都具有相同的大小。从向量中添加和删除元素不会改变它的大小;它改变了它管理的动态内存。 -
但是,这并不一定意味着您可以提前知道您将有足够的内存来完成作业。如果无法分配足够的内存,
std::vector复制构造函数可能会抛出。如果您想为如何使用内存提供自己的保证,则必须考虑为向量使用自定义分配器。 -
请注意,当您重新分配 foo 时,foo 指向的初始堆内存仍然存在。此外,指向向量的指针通常是一种代码味道。
-
@doug 确实如此。我能做的事情非常有限,因为我在一个只能返回指针的 FFI 世界中工作
标签: c++ memory memory-management new-operator