C++中的placement new与placement delete解析

5星 · 超过95%的资源 需积分: 0 3 下载量 109 浏览量 更新于2024-07-27 收藏 1.61MB PDF 举报
"More Effective C++" 在C++中,`malloc()` 和 `free()` 的对应函数是 `operator new` 和 `operator delete`。与 `malloc()` 和 `free()` 不同,`operator new` 和 `operator delete` 可以被重载,允许接收不同数量和类型的参数。`operator new` 的基本签名是 `void * operator new(size_t)`,而 `operator delete` 的基本签名是 `void operator delete(void*)`。重载 `operator new` 可以添加额外的参数,例如 `void * operator new(size_t, void *whereToPutObject)`,这是一个放置(new placement)操作,允许指定对象在内存中的位置。放置(new placement)的概念在C++标准库中非常常见,尤其在 `<new>` 头文件中。 放置(new placement)不仅仅是针对 `void*` 参数,还可以是任何比基本 `size_t` 参数更多的版本。当讨论放置(new placement)时,C++程序员可能指的是接受额外参数的任何 `operator new` 或 `operator delete` 版本。如果在对象构造过程中发生异常,标准规定如果异常来自构造函数,`operator delete` 会被自动调用来释放由 `operator new` 分配的内存。但是,如果 `operator new` 被重载,那么需要确保对应的 `operator delete` 也被相应地重载,以便正确处理内存的释放。 这本书《More Effective C++》由Scott Meyers撰写,由侯捷翻译,包含了关于C++编程的深入实践建议,如指针与引用的区别、谨慎定义类型转换函数、理解`new`和`delete`的不同含义以及异常处理的最佳实践。书中涵盖基础议题、运算符、异常处理和效率提升等多个方面,帮助程序员写出更高效、更健壮的C++代码。每个条目(item)都详细阐述了一个特定的C++主题,并提供了实用的技巧和建议。例如,如何防止资源泄漏、如何有效地使用异常处理,以及如何通过优化避免不必要的性能损失等。