在C++中Delete指针的用法

首先需要声明,delete指针只可以用于释放由new运算符动态生成的内存不可以用于释放静态分配的内存,还有自动存储期内的内存.

    静态分配(全局变量或静态变量)

  • 在程序的整个生命周期内都存在。
  • 不需要手动释放。l
  • static int globalVar; // 静态分配

    自动存储期(局部变量)

  • 在函数或代码块内创建和销毁。
  • 离开作用域时自动释放,不需要手动释放。
  • void func() {
        int localVar; // 自动存储期
    } // localVar 在 func 结束时自动释放

    在 C++ 中,delete 操作符用于释放之前使用 new 分配的动态内存。当你执行 delete ptr; 时,它只会释放 ptr 指向的内存,但不会删除指针 ptr 本身。指针 ptr 仍然存在,但它现在是一个“野指针”(指向已经被释放的内存),使用它将会导致未定义行为。

    为了防止出现野指针,释放内存后应该将指针设置为 nullptr。这样,指针就不会指向任何内存,从而避免潜在的危险。但是为什么现在写的那么多C++/C代码中很少看见有将删除的指针ptr=nullptr这个指令呢?:以下是原因分析:

在 C++/C 语言中,使用 `delete` 删除指针所指向的内存后,并没有系统自动将指针设置为 `nullptr` 的机制。这是一个常见的误解。实际上,`delete` 操作符只负责释放内存,而不会自动修改指针的值。

不经常看到 `ptr = nullptr;` 的原因可能有以下几点:

1. **代码风格和习惯**:
   - 有些开发者可能没有意识到将指针设置为 `nullptr` 的重要性,或者他们的代码风格和习惯中没有包含这一步骤。

2. **代码示例的简洁性**:
   - 在教学或示例代码中,为了保持简洁,可能会省略 `ptr = nullptr;` 这一步,尤其是在简单的示例或短代码片段中。

3. **自动存储期变量**:
   - 如果指针是函数内的局部变量,那么在函数结束时,局部变量会自动销毁,包括它们指向的内存(如果已经释放)。在这种情况下,将指针设置为 `nullptr` 不是必需的,因为指针本身很快就会不再存在。

4. **代码错误或遗漏**:
   - 有时,开发者可能忘记了将指针设置为 `nullptr`,或者认为这不是必要的,这可能导致野指针问题。

5. **代码上下文**:
   - 在某些情况下,开发者可能知道在 `delete` 之后不会再使用该指针,因此省略了设置 `nullptr` 的步骤。

尽管如此,将指针设置为 `nullptr` 后使用 `delete` 是一个好习惯,因为这可以避免野指针问题。野指针是指指向已经被释放内存的指针,使用野指针可能会导致未定义行为,包括程序崩溃、数据损坏等。

因此,最佳实践是在释放指针指向的内存后,立即将指针设置为 `nullptr`:

int* ptr = new int;
*ptr = 10;
delete ptr;
ptr = nullptr; // 避免野指针

这样做可以确保指针不会意外地被再次使用,从而提高代码的安全性和稳定性。

但是现在我不知道为什么我一用这个delete总会报错.
 

C++ 中,使用 `delete[]` 运算符可以释放通过 `new[]` 动态分配的数组内存。正确使用 `delete[]` 是避免内存泄漏和程序崩溃的关键。 ### 正确用法 当使用 `new[]` 分配一个数组时,必须使用 `delete[]` 来释放该数组所占用的内存。例如: ```cpp int* arr = new int[10]; // 分配一个包含10个整数的数组 // 使用数组... delete[] arr; // 正确释放数组 ``` 对于多维数组的动态分配和释放,通常需要先为指针数组分配内存,然后依次为每个子数组分配内存,并在释放时按照相反的顺序进行: ```cpp int n = 10, m = 5; int** dp = new int*[n]; // 分配一个指针数组 for (int i = 0; i < n; ++i) { dp[i] = new int[m]; // 为每个指针分配一个数组 } // 使用二维数组... // 释放内存时,首先释放每个子数组 for (int i = 0; i < n; ++i) { delete[] dp[i]; } // 然后释放指针数组 delete[] dp; ``` ### 注意事项 1. **匹配使用 `new[]` 和 `delete[]`** 如果使用 `new[]` 分配了内存,则必须使用 `delete[]` 来释放它;如果使用 `new` 分配单个对象,则应使用普通的 `delete` 操作符[^3]。 2. **不要多次释放同一块内存** 多次调用 `delete` 或 `delete[]` 在同一块内存上会导致未定义行为。例如: ```cpp int* p = new int; *p = 5; delete p; delete p; // 错误:重复释放内存 [^3] ``` 3. **确保只释放动态分配的内存** 不要尝试使用 `delete` 或 `delete[]` 释放非动态分配的内存(如栈上的局部变量),否则会导致运行时错误。 4. **避免悬空指针** 释放内存后,应该将指针设置为 `nullptr`,以防止后续误用导致的问题: ```cpp int* arr = new int[10]; delete[] arr; arr = nullptr; // 避免悬空指针 ``` 5. **不能对非数组指针使用 `delete[]`** 如果一个指针不是通过 `new[]` 分配的数组,那么不应使用 `delete[]` 来释放它。例如: ```cpp int* p = new int; delete[] p; // 错误:使用 delete[] 释放非数组内存 ``` 6. **语法限制** 在使用 `new` 分配数组时,不能在括号中添加类型修饰符,例如 `new (int)[N]` 是非法的,这会导致编译错误[^4]。 7. **释放多维数组时的顺序** 在释放多维数组时,必须先释放所有子数组,然后再释放主指针数组,否则可能导致内存泄漏[^2]。 ### 示例代码 以下是一个完整的示例,展示如何正确分配和释放一维及二维数组: ```cpp #include <iostream> using namespace std; int main() { // 一维数组 int* arr = new int[5]; for (int i = 0; i < 5; ++i) { arr[i] = i * 10; } for (int i = 0; i < 5; ++i) { cout << arr[i] << " "; } cout << endl; delete[] arr; // 二维数组 int n = 3, m = 4; int** matrix = new int*[n]; for (int i = 0; i < n; ++i) { matrix[i] = new int[m]; for (int j = 0; j < m; ++j) { matrix[i][j] = i + j; } } for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cout << matrix[i][j] << " "; } cout << endl; } // 释放二维数组 for (int i = 0; i < n; ++i) { delete[] matrix[i]; } delete[] matrix; return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值