C++中new 和 delete 的使用

本文详细介绍了C++中的new和delete操作符如何用于动态内存的分配和释放,包括如何通过new为单个对象或数组分配内存,以及如何使用delete释放内存。通过示例代码演示了内存分配与初始化、初始化后的使用以及内存释放的过程。

new和delete可以有效、直接的进行动态内存的分配和释放。

运算符new返回指定类型的一个指针,如果分配失败(如没有足够的内存空间)时,则返回0.

如:  

1 double *p;
2 p = new double;
3 *p = 3.1;     //将值存放在开辟的单元中

系统自动根据double类型的空间大小开辟内存单元,并将地址放在指针p中。

当然,也可以在开辟内存单元时对单元里的值进行初始化。

则,上述代码等价于:

1 double *p;
2 p = new double(3.1);

运算符delete是释放new请求的内存单元。

delete p将指针变量p指向的内存单元释放,指针变量p仍然有效,它可以重新指向另一个内存单元。

new也可以为数组分配内存单元,当释放时,也可以告诉delete数组有多少个。

如:

1 int *p;
2 p = new int[10];
3 delete [10]p; //告诉delete数组有多少个元素,或delete []p;

例子:

 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     char *p = new char[6];
 9 
10     strcpy(p,"Hello");
11     cout << p << endl;
12     delete[] p;
13     cout << p << endl;
14 
15     return 0;
16 }

运行结果:

1Hello

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
### C++中 `new` `delete` 的操作及正确使用方法 #### 1. 动态内存分配与释放 `new` `delete` 是C++中用于动态内存管理的操作符。`new` 用于分配内存并初始化对象,而 `delete` 用于释放由 `new` 分配的内存[^2]。 ```cpp #include <iostream> int main() { int* ptr = new int; // 使用 new 分配一个整数对象 *ptr = 10; std::cout << "Value: " << *ptr << std::endl; delete ptr; // 使用 delete 释放内存 return 0; } ``` #### 2. 分配基本数据类型 当需要为基本数据类型分配内存时,可以直接使用 `new` 操作符,并通过括号指定初始值[^1]。 ```cpp int* a = new int(10); // 分配一个整数并初始化为10 double* b = new double(3.14); // 分配一个双精度浮点数并初始化为3.14 ``` #### 3. 分配自定义类的对象 对于自定义类,`new` 不仅分配内存,还会调用类的构造函数进行初始化。同样,`delete` 在释放内存之前会调用析构函数[^2]。 ```cpp class MyClass { public: MyClass() { std::cout << "Constructor called" << std::endl; } ~MyClass() { std::cout << "Destructor called" << std::endl; } }; int main() { MyClass* obj = new MyClass(); // 调用构造函数 delete obj; // 调用析构函数并释放内存 return 0; } ``` #### 4. 分配数组 `new` 还可以用于分配数组,此时需要使用方括号指定数组大小。释放数组时,必须使用 `delete[]`,以确保所有元素的析构函数都被调用。 ```cpp int* arr = new int[5]; // 分配一个包含5个整数的数组 for (int i = 0; i < 5; ++i) { arr[i] = i; } delete[] arr; // 使用 delete[] 释放数组 ``` #### 5. 定位 `new`(Placement New) 定位 `new` 允许在特定的内存地址上构造对象,而不分配新的内存空间。使用时需要手动调用对象的析构函数来清理资源[^5]。 ```cpp #include <iostream> #include <new> // 包含 placement new int main() { char buffer[sizeof(int)]; // 提供内存空间 int* p = new (buffer) int(42); // 在 buffer 中构造整数 std::cout << *p << std::endl; p->~int(); // 手动调用析构函数 return 0; } ``` #### 6. 常见问题与注意事项 - **双重释放**:避免对同一指针多次调用 `delete`,否则会导致未定义行为[^4]。 - **内存泄漏**:确保每个 `new` 都有一个对应的 `delete`,否则可能导致内存泄漏。 - **异常安全**:在复杂的程序中,建议使用智能指针(如 `std::unique_ptr` 或 `std::shared_ptr`)管理动态内存,以提高代码的安全性可维护性。 ```cpp #include <memory> int main() { std::unique_ptr<int> ptr(new int(10)); // 使用 unique_ptr 管理内存 std::cout << *ptr << std::endl; return 0; // 内存自动释放 } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值