新与新(以malloc为特色!)

Ann*_*inn 2 c++ memory malloc new-operator

在C++中,它是标准的始终使用newmalloc().但是,在这个问题中,new在避免平台特定代码的同时使运营商超载的最便携方式是malloc()在其中进行调用以进行实际分配.

当重载时,调用构造函数并保持类型安全性.此外,您还可以监视和控制内存的分配方式.

我的问题是,在这个容量中使用时,malloc()在C++中使用仍然有任何缺点吗?

Dav*_*nan 7

如果你想覆盖new,delete那么你几乎必须使用mallocfree.这就是它的意图.不要害怕.

使用malloc()外部的缺点new()仍然存在.


Jas*_*son 5

我能想到的最大缺点是你不能显式调用delete或者delete []malloc()没有调用未定义行为的情况下使用已分配的指针.如果您打算使用高度不推荐的路径并使用malloc()为C++对象显式分配内存,那么您仍然需要调用placement new以正确调用构造函数来初始化分配的内存位置malloc().如果没有operator new包装器malloc(),您还必须进行测试以确保没有获得NULL返回值,并创建一些代码来处理您没有抛出异常的情况.如果您只是尝试使用C库函数memcpy()来将C++对象复制到分配的堆内存中,那么它也会非常危险,并且会产生许多未定义的行为malloc().

此外,因为您用于placement new对象构造,所以您必须为动态分配的对象显式调用析构函数,然后显式调用free()指针.如果处理不正确,这又会导致各种问题,特别是如果您想使用多态类型和虚拟基类.

如果你想与刚参加工作malloc()free()拇指的一个很好的规则,以避免不确定的行为缺陷是保持你分配的对象,并取消分配malloc()free()到POD类型.这意味着非多态结构或类没有用户定义的构造函数,析构函数,复制构造函数,赋值运算符,私有/受保护的非静态数据成员或基类,以及所有非静态数据成员struct/class本身就是POD类型.由于POD类型基本上是C风格的结构(但具有定义非静态方法和this指针的附加功能),您可以安全地使用它们进行C风格的内存管理.