首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新版本与新版本(支持malloc!)

新版本与新版本(支持malloc!)
EN

Stack Overflow用户
提问于 2011-09-22 11:45:14
回答 3查看 591关注 0票数 2

在C++中,总是使用new而不是malloc()是标准。然而,在这个question中,重载new操作符同时避免特定于平台的代码的最可移植的方法是在其中调用malloc()来执行实际分配。

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

我的问题是,当在这种能力下使用时,在C++中使用malloc()还有什么缺点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-22 11:54:19

我能想到的最大缺点是,在使用malloc()分配的指针上,不能显式调用deletedelete [],而不调用未定义的行为。如果您打算走非常不推荐的路径,并使用malloc()显式地为C++对象分配内存,那么您仍然必须调用placement new才能正确地调用构造函数来初始化由malloc()分配的内存位置。在malloc()上没有operator new包装器的情况下,您还必须进行测试以确保不会得到NULL返回值,并创建一些代码来处理没有抛出异常的情况。如果您只是试图使用像memcpy()这样的C库函数将C++对象复制到使用malloc()分配的堆内存中,这也是非常危险的,并且可能导致许多未定义的行为。

此外,由于您在对象构造中使用了placement new,因此必须显式调用动态分配对象的析构函数,然后显式调用指针上的free()。如果没有正确处理,这同样会导致各种问题,特别是当您想要处理多态类型和虚拟基类时。

如果你打算只使用malloc()free(),避免未定义行为陷阱的一个很好的经验法则是保留你分配的对象,并使用malloc()free()将其释放到POD类型。这意味着没有用户定义的构造函数、析构函数、复制构造函数、赋值运算符、私有/受保护的非静态数据成员或基类的非多态结构或类,以及结构/类的所有非静态数据成员本身都是POD类型。因为POD类型基本上是C风格的结构(但增加了定义非静态方法和this指针的能力),所以您可以安全地使用它们进行C风格的内存管理。

票数 5
EN

Stack Overflow用户

发布于 2011-09-22 11:53:48

如果您希望覆盖newdelete,那么您几乎必须使用mallocfree。这就是它应该如何做的。不要害怕。

new()实现之外使用malloc()的缺点仍然存在。

票数 7
EN

Stack Overflow用户

发布于 2011-09-22 11:53:39

你自己说的..。在C++代码中直接使用malloc/free的缺点是不会运行构造函数和析构函数;使用new/delete可以确保运行构造函数和析构函数。但是,通过new/delete操作符间接使用malloc并没有错。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7509320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档