c++中new和delete的使用方法

本文详细介绍了C++中new和delete运算符的使用方法,包括为单个变量和数组分配及释放内存的具体操作。此外还解释了如何通过指针访问new分配的内存空间。

new和delete运算符用于动态分配和撤销内存的运算符

new用法:

1. 开辟单变量地址空间

1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.

2)int *a = new int(5) 作用同上,但是同时将整数赋值为5

2. 开辟数组空间

一维: int *a = new int[num];开辟一个大小为num的整型数组空间

二维: int **a = new int[num_1][num_2]

或者   int **a = new int *[num]

           for(int i = 0 ; i < num; i++)

   a[i] = new int[num]; 

三维及其以上:依此类推.

一般用法: new 类型 [初值]

delete用法:

1. int *a = new int;

delete a; //释放单个int的空间

2.int *a = new int[5];

delete [] a; //释放int数组空间

要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.

用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它

### 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; // 内存自动释放 } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值