delete和delete[]

C++中delete和delete[]的区别
本文主要探讨C++里delete和delete[]的区别。回收new分配的单个对象内存用delete,回收new[]分配的一组对象内存用delete[]。对于基本数据类型数组,delete和delete[]均可;类对象数组只能用delete[],new的单个对象只能用delete。使用原则是new和delete、new[]和delete[]对应。

 一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。

    C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

请看下面的程序。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>;
using namespace std;
 
class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};
 
int main()
{
  const int NUM = 3;
 
  T* p1 = new T[NUM];
  cout << hex << p1 << endl;
  //  delete[] p1;
  delete p1;
 
  T* p2 = new T[NUM];
  cout << p2 << endl;
  delete[] p2;
}

 

大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。


    从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。
    基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
    所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

06-04
### 使用 `delete` 在编程或数据库中的方法及常见错误解决 在编程数据库操作中,`delete` 是一种用于删除数据的命令或函数。以下是关于如何在编程语言(如 C#)数据库(如 SQL)中使用 `delete` 的详细说明。 #### 1. **在 SQL 中使用 DELETE** SQL 的 `DELETE` 语句用于从表中删除现有记录。其基本语法如下: ```sql DELETE FROM table_name WHERE condition; ``` - `table_name` 是要从中删除记录的表。 - `condition` 是一个布尔表达式,指定哪些记录应该被删除。如果省略 `WHERE` 子句,则会删除表中的所有记录[^1]。 例如,假设有一个名为 `Employees` 的表,要删除 `id` 为 5 的员工记录: ```sql DELETE FROM Employees WHERE id = 5; ``` 需要注意的是,在执行删除操作之前,建议先运行 `SELECT` 查询以验证将要删除的记录,避免误删重要数据。 #### 2. **在 Entity Framework Core (EF Core) 中使用 DELETE** Entity Framework Core 提供了多种方式来执行删除操作。以下是一个简单的示例,展示如何通过 EF Core 删除一条记录: 首先定义模型类 DbContext: ```csharp public class Employee { public int Id { get; set; } public string Name { get; set; } } public class ApplicationDbContext : DbContext { public DbSet<Employee> Employees { get; set; } } ``` 接下来,使用以下代码删除记录: ```csharp using (var context = new ApplicationDbContext()) { var employee = context.Employees.Find(5); // 查找 ID 为 5 的员工 if (employee != null) { context.Employees.Remove(employee); // 移除对象 context.SaveChanges(); // 持久化更改到数据库 } } ``` 此外,还可以直接执行原始 SQL 命令进行删除: ```csharp context.Database.ExecuteSqlRaw("DELETE FROM Employees WHERE Id = @p0", 5); ``` #### 3. **解决与 DELETE 相关的常见错误** 当使用 `DELETE` 时,可能会遇到一些常见的问题。例如: - **性能瓶颈**:如果未正确索引经常查询的列,可能导致删除操作变得非常缓慢[^2]。 - **误删数据**:如果没有 `WHERE` 条件,或者条件设置错误,可能会意外删除大量数据。因此,始终确保在删除前验证条件。 - **外键约束冲突**:尝试删除受外键约束保护的记录时,可能会导致错误。可以通过级联删除或手动删除相关记录来解决此问题。 #### 4. **示例代码总结** 以下是一些完整的代码示例,展示了如何在不同场景下使用 `DELETE`。 ##### SQL 示例 ```sql -- 删除单条记录 DELETE FROM Employees WHERE id = 5; -- 删除多条记录 DELETE FROM Employees WHERE department = 'HR'; ``` ##### EF Core 示例 ```csharp // 删除单条记录 using (var context = new ApplicationDbContext()) { var employee = context.Employees.Find(5); if (employee != null) { context.Employees.Remove(employee); context.SaveChanges(); } } // 执行原始 SQL 删除 context.Database.ExecuteSqlRaw("DELETE FROM Employees WHERE department = @p0", "HR"); ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值