在 C++ 编程语言中,new 和 delete 运算符用于动态内存分配和释放。这些运算符与内存堆(heap)的交互,允许程序员在运行时分配和撤销内存块。
new 运算符
new 运算符用于在内存堆上分配一块内存,并返回一个指向该内存块的指针。当使用 new 分配内存时,系统还会调用构造函数来初始化分配的对象。
在上面的例子中,new int(10) 分配了一块内存,并使用构造函数 int(10) 初始化了一个 int 类型的对象。ptr 指针指向这块内存。
delete 运算符
delete 运算符用于释放由 new 分配的内存。当使用 delete 释放内存时,系统会调用析构函数来清理对象,如果对象是一个类实例,则还会调用虚析构函数(如果存在的话)。
在上面的例子中,delete ptr; 释放了之前由 new 分配的内存。注意,释放内存后,指针 ptr 变为 nullptr,即空指针。
注意事项
不要在 delete 之后使用指针:一旦释放了内存,指针就不再有效,尝试访问它会导致未定义行为。
不要在 delete 之后立即用 new 重新分配同一块内存:这样做会导致内存泄漏,因为旧内存没有被正确释放。
如果你连续释放同一个指针多次,只会释放一次内存。
异常安全
new 和 delete 运算符不是异常安全的。如果你在构造函数或析构函数中抛出异常,内存可能会泄漏。为了保证异常安全,可以使用 new(std::nothrow),它会在内存分配失败时返回 nullptr,或者使用智能指针如 std::unique_ptr 或 std::shared_ptr。
智能指针
在 C++11 及更高版本中,推荐使用智能指针来管理动态分配的内存,因为它们提供了自动内存管理的功能,可以确保对象在不再需要时被正确释放。