在 C++ 中,内存的申请和释放通常通过动态内存管理来实现。动态内存管理允许程序在运行时动态地分配和释放内存,以满足程序在不同阶段的需求。

在 C++ 中,可以使用以下两个关键字来进行内存的申请和释放:

  1. new:用于动态地分配内存。new 运算符可用于创建单个对象或一组对象,并返回指向分配内存的指针。
    例如:
int* p = new int;  // 动态分配一个 int 类型的内存块
int* arr = new int[10];  // 动态分配一个包含 10 个 int 元素的数组
  1. delete:用于释放动态分配的内存。delete 运算符用于销毁动态分配的对象或数组,并释放其占用的内存。
    例如:
delete p;  // 释放通过 new 分配的内存
delete[] arr;  // 释放通过 new[] 分配的内存

需要注意的是,使用 new 分配的内存必须使用对应的 delete 进行释放,而使用 new[] 分配的数组内存必须使用对应的 delete[] 进行释放。否则,会导致内存泄漏或者未定义的行为。

在现代 C++ 中,可以使用智能指针(如 std::unique_ptrstd::shared_ptr)来管理动态内存,以提供更安全和方便的内存管理。这些智能指针可以自动处理内存的释放,减少了手动释放内存的风险。

以下是使用 std::unique_ptr 的示例:

#include <memory>

std::unique_ptr<int> p(new int);  // 使用 unique_ptr 动态分配内存
*p = 42;  // 访问和操作内存
// 内存会在 unique_ptr 超出作用域时自动释放,无需显式调用 delete

动态内存管理是一项重要的任务,要确保在动态分配内存后适时释放,以避免内存泄漏和资源浪费。使用智能指针或遵循正确的内存管理规则可以帮助简化内存管理的过程,并提高代码的可靠性和安全性。

std::shared_ptr 是 C++ 标准库中提供的智能指针之一,用于管理动态分配的内存。与 std::unique_ptr 不同,std::shared_ptr 允许多个指针共享同一个对象的所有权,并在最后一个引用被释放时自动销毁对象。

以下是使用 std::shared_ptr 的示例:

#include <memory>
#include <iostream>

struct MyClass {
    int data;

    MyClass(int d) : data(d) {
        std::cout << "Constructing MyClass, data = " << data << std::endl;
    }

    ~MyClass() {
        std::cout << "Destructing MyClass, data = " << data << std::endl;
    }
};

int main() {
    std::shared_ptr<MyClass> ptr1(new MyClass(10));
    std::shared_ptr<MyClass> ptr2 = ptr1;  // 共享所有权

    std::cout << "ptr1: " << ptr1->data << std::endl;
    std::cout << "ptr2: " << ptr2->data << std::endl;

    ptr1.reset();  // 释放 ptr1 的所有权
    std::cout << "ptr2: " << ptr2->data << std::endl;

    ptr2.reset();  // 释放 ptr2 的所有权,对象被销毁

    return 0;
}

在上述示例中,我们创建了一个名为 MyClass 的类,它包含一个整数数据成员。然后,我们使用 std::shared_ptr 创建了两个指向 MyClass 对象的智能指针 ptr1ptr2

由于 ptr1ptr2 共享相同的对象所有权,因此它们指向同一个 MyClass 对象。当其中一个智能指针失去所有权(通过 reset() 或超出作用域)时,仍然存在其他智能指针保持所有权,因此对象不会被销毁。只有当最后一个智能指针失去所有权时,才会自动调用对象的析构函数进行销毁。

输出结果为:

Constructing MyClass, data = 10
ptr1: 10
ptr2: 10
ptr2: 10
Destructing MyClass, data = 10

从输出结果可以看出,当最后一个指向对象的智能指针 ptr2 失去所有权时,对象被销毁,并调用了析构函数。

使用 std::shared_ptr 可以方便地管理动态分配的内存,并避免内存泄漏和野指针的问题。通过共享所有权的方式,多个智能指针可以协同管理同一个对象,提供更灵活的内存管理功能。