Raj*_*hta 24 c++ arrays malloc memory-management new-operator
我理解在C++ 中使用new反对的好处malloc.但是,对于特定的情况下,如原始数据类型(非阵列) - int,float等等,是它更快地使用malloc比new?
虽然,new如果我们分配一个数组以便我们可以使用,它总是建议甚至用于原语delete[].
但对于非数组分配,我认为不会有任何构造函数调用int?因为,new运算符分配内存,检查它是否已分配,然后调用构造函数.但只为元非阵列堆分配,是它更好地使用malloc比new?
请指教.
Vit*_*meo 83
永远不要malloc在C++中使用.new除非您正在实现低级别内存管理原语,否则切勿使用.
建议是:
问问自己:"我需要动态内存分配吗?" .很多时候你可能不需要它 - 更喜欢指针的值,并尝试使用堆栈.
如果确实需要动态内存分配,请问自己"谁将拥有已分配的内存/对象?" .
如果您只需要一个拥有者(很可能),您应该使用std::unique_ptr.它是在零成本的抽象
new/ delete.(可以指定不同的解除分配器.)
如果您需要共享所有权,则应使用std::shared_ptr.这不是零成本抽象,因为它使用原子操作和额外的"控制块"来跟踪所有所有者.
如果您特别处理数组,标准库提供了两个功能强大且安全的抽象,不需要任何手动内存管理:
std::array<T, N>:N类型固定的元素数组T.
std::vector<T>:可调整大小的元素数组T.
std::array并std::vector应覆盖99%的"阵列需求".
一个更重要的事情:标准库提供的std::make_unique,并std::make_shared应该总是被用来创建智能指针实例.有几个很好的理由:
更短 - 无需重复T (例如std::unique_ptr<T>{new T}),无需使用new.
更安全的例外.它们可以防止由于函数调用中缺乏明确定义的评估顺序而导致的潜在内存泄漏.例如
f(std::shared_ptr<int>(new int(42)), g())
Run Code Online (Sandbox Code Playgroud)
可以按此顺序进行评估:
new int(42)g() 如果g()抛出,int就会泄露.
更高效(就运行时速度而言).这仅适用于std::make_shared- 使用它而不是std::shared_ptr直接允许实现为对象和控制块执行单个分配.
您可以在此问题中找到更多信息.
zwo*_*wol 26
它仍然是必要的使用malloc和free在C++中,当你使用的API进行交互指定使用普通C,因为它不保证安全使用free,以收回与分配的内存operator new(这是最终什么都托管内存类的使用),也不用于operator delete释放分配的内存malloc.
一个典型的例子是POSIXgetline(不要混淆std::getline):它需要一个指向char *变量的指针; 该变量必须指向一个分配的内存块malloc(或者它可以是NULL,在这种情况下getline会调用malloc你); 当你完成呼叫时,getline你应该调用free那个变量.
类似地,如果您正在编写库,那么在内部使用C++但extern "C"为外部调用者定义API是有意义的,因为这可以提供更好的二进制接口稳定性和跨语言互操作性.如果将堆分配的POD对象返回给调用者,您可能希望让它们取消分配这些对象free; 它们不一定能够使用delete,并且YourLibraryFree当没有需要析构函数类型的操作时使它们调用是不符合人体工程学的.
malloc在实现可调整大小的容器对象时,仍然需要使用它,因为没有相应的reallocfor operator new.
但正如其他答案所说,当你没有这种界面约束时,请使用其中一个托管内存类.
它总是更好用new.如果您使用,malloc您还必须手动检查是否分配了空间.
在现代c ++中,您可以使用智能指针.有了make_unique和make_shared你永远不会调用new明确.std::unique_ptr不大于底层指针,使用它的开销很小.
"我应该使用new或malloc"的答案是单一责任规则.
资源管理应该以一种唯一目的来完成.
这些类已经存在,例如unique_ptr,vector等等.
直接使用或者malloc还是new一个大忌.
| 归档时间: |
|
| 查看次数: |
4382 次 |
| 最近记录: |