placement new本质是分离内存分配与对象构造,仅在指定地址构造对象而不分配内存,需手动调用析构函数并管理内存生命周期,适用于自定义内存池、共享内存、硬件交互等需精细控制内存的场景。

C++ 中的
placement new
new
placement new
new (address) Type(arguments);
address
void*
我个人觉得,理解
placement new
malloc
一个典型的使用场景是这样的:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <string>
#include <new> // 包含 placement new 的头文件
class MyClass {
public:
int value;
std::string name;
MyClass(int v, const std::string& n) : value(v), name(n) {
std::cout << "MyClass constructor called for: " << name << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor called for: " << name << std::endl;
}
void print() const {
std::cout << "Value: " << value << ", Name: " << name << std::endl;
}
};
int main() {
// 1. 准备一块足够大的内存
// 注意:这里需要确保内存对齐,sizeof(MyClass) 只是最小需求
// 通常会用 std::aligned_storage_t 或 char 数组配合 alignas
// 为了简化示例,这里先用 char 数组,实际项目中需更严谨处理对齐
char buffer[sizeof(MyClass)];
void* raw_memory = static_cast<void*>(buffer);
// 2. 在这块内存上构造对象
// 注意:这里没有调用 operator new 分配内存,只是在指定地址构造
MyClass* obj1 = new (raw_memory) MyClass(10, "FirstObject");
obj1->print();
// 3. 使用对象...
// 4. 手动调用析构函数
// 记住:placement new 不会为你管理对象的生命周期,析构函数必须手动调用
obj1->~MyClass();
// 5. 释放内存(如果内存是通过 malloc 等动态分配的,这里需要 free)
// 由于这里用的是栈上的 char 数组,无需手动 free
// 如果是 malloc 分配的:free(raw_memory);
std::cout << "------------------" << std::endl;
// 另一个例子:在堆上分配内存,然后使用 placement new
// 假设我们有一个自定义的内存池,它返回一个指针
void* heap_memory = std::malloc(sizeof(MyClass));
if (!heap_memory) {
std::cerr << "Memory allocation failed!" << std::endl;
return 1;
}
MyClass* obj2 = new (heap_memory) MyClass(20, "SecondObject");
obj2->print();
obj2->~MyClass(); // 手动调用析构函数
std::free(heap_memory); // 释放通过 malloc 分配的内存
return 0;
}placement new
new
new
MyClass* p = new MyClass();
operator new
placement new
我个人觉得,这种分离带来的好处是显而易见的,尤其是在一些对性能和内存控制有极致要求的场景。
它的主要应用场景包括:
new/delete
placement new
new
placement new
placement new
placement new
placement new
说实话,
placement new
几个关键点,我每次用的时候都会提醒自己:
placement new
delete
delete
obj_ptr->~MyClass();
std::string
malloc
free
new char[N]
delete[]
placement new
delete
delete
sizeof(Type)
alignof(Type)
alignas
std::aligned_storage_t
alignas
std::byte
alignas(MyClass) char buffer[sizeof(MyClass)];
placement new
现代 C++ 确实提供了不少工具,让内存管理和对象生命周期控制变得更安全、更自动化,有时候会让人觉得
placement new
替代方案(或更高层封装):
std::unique_ptr
std::shared_ptr
delete
std::unique_ptr<FILE, decltype(&fclose)> file_ptr(fopen("test.txt", "r"), &fclose);std::allocator
std::allocator
placement new
std::vector
Allocator
construct
destroy
placement new
std::pmr::polymorphic_allocator
std::pmr::memory_resource
polymorphic_allocator
placement new
memory_resource
std::byte
std::launder
std::byte
std::launder
placement new
不可替代的场景:
尽管有这些现代工具,
placement new
new
placement new
placement new
placement new
std::vector
std::map
placement new
在我看来,
placement new
placement new
以上就是C++ placement new 指定地址对象构造的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号