指针和动态运算符new delete

本文深入讲解了C++中指针的声明、赋值和使用,通过实例演示了如何利用指针操作变量,解释了指针存储地址和通过指针访问地址内容的概念,同时介绍了动态内存分配的方法。

 给大家一个指针的声明、赋值和使用的例子:

1

2

3

4

5

6

7

8

9

10

11

12

       #include<iostream>

       using namespace std;

       int main()

       {

                int *p; //声明int型指针p

                int i; //声明int型数i

                p=&i; //取i的地址赋给p

                i=6; //int型数赋初值

                cout<<"Output int i="<<i<<endl;//输出int型数的值

                cout<<"Output int pointer i="<<*p<<endl;//输出int型指针所指地址的内容

                return 0;

       }

      程序运行结果是:

      Output int i=6
      Output int pointer i=6

数组名就是数组的首地址,因此可以用数组名初始化指针。

 敲黑板,划重点----------------也就是说p存储的是地址,*p存储的是该地址的数值。———————————————

 

 

int *p;

p = new int(10);

上面语句动态分配了一个用来存放整数数据的内存空间。同时把整数10放入内存空间中,也就是p指向的是整形数据10,最后把内存空间的首地址给p。

 

<think>好的,用户想了解C++中newdelete运算符的正确使用方法,并需要示例。我需要先回顾一下相关的知识点,确保回答准确。首先,new用于动态分配内存,delete用于释放内存,这是基础。然后要提到配对使用的重要性,避免内存泄漏。可能还需要覆盖数组的情况,比如使用new[]delete[]。此外,用户提供的引用资料里提到了一些细节,比如析构函数的调用全局运算符的使用,这些也要整合进去。 用户可能对基本用法比较熟悉,但或许不清楚一些常见错误,比如不匹配使用newdelete[],或者忘记释放内存导致泄漏。示例部分应该包括基本类型、对象、数组以及二维数组的情况,这样能全面展示不同场景下的正确用法。还要注意提醒使用智能指针来避免手动管理的问题,这符合现代C++的最佳实践。 另外,引用资料中提到,即使类定义了自身的new运算符,仍然可以使用全局的,比如::new,这可能是一个高级用法,可以简单提及。需要确保示例代码语法正确,并且注释清晰,帮助用户理解每一步的作用。最后,常见问题部分需要涵盖内存泄漏、悬空指针、异常安全等,这些都是使用newdelete时容易遇到的坑。 总结一下,回答的结构应该是:基本语法、正确用法步骤、示例代码(各种情况)、注意事项、常见错误及避免方法,最后相关问题。这样用户能逐步理解并正确应用这些运算符。同时要确保引用资料中的信息被正确引用,比如关于析构函数全局运算符的部分。</think>### C++中new/delete运算符使用指南 一、基础语法特性 1. 基本配对关系 - `new`运算符动态分配单个对象内存`T* ptr = new T;`或数组`T* arr = new T[N];` - `delete`运算符:释放单个对象`delete ptr;`或数组`delete[] arr;`[^3] 2. 内存操作流程 ```cpp // 内存分配时执行的操作序列 operator new() // 分配原始内存 构造函数 // 对象初始化 // 内存释放时执行的操作序列 析构函数 // 对象清理 operator delete() // 释放内存 ``` 二、正确使用步骤 1. 单个对象操作 ```cpp // 分配并初始化int对象 int* num = new int(10); // 使用后释放 delete num; // 正确配对 ``` 2. 对象数组处理(注意数组语法) ```cpp // 分配包含5个MyClass对象的数组 MyClass* arr = new MyClass[5]; // 必须使用数组删除器 delete[] arr; // 正确配对[^2] ``` 3. 二维数组示例 ```cpp // 分配3x4整型数组 int** matrix = new int*[3]; for(int i=0; i<3; ++i) matrix[i] = new int[4]; // 释放内存(逆序) for(int i=0; i<3; ++i) delete[] matrix[i]; delete[] matrix; ``` 三、关键注意事项 1. 强制配对规则 - `new`与`delete`必须严格配对使用 - `new[]`必须对应`delete[]`,否则会导致未定义行为[^3] 2. 异常安全实践 ```cpp MyClass* obj = nullptr; try { obj = new MyClass; // 使用对象 } catch(...) { delete obj; // 异常时清理 throw; } delete obj; ``` 3. 现代C++改进方案(推荐替代方案) ```cpp // 使用智能指针自动管理 std::unique_ptr<MyClass> smartPtr(new MyClass); // 自动调用delete,无需手动释放 ``` 四、常见错误示例 1. 内存泄漏案例 ```cpp void leaky_func() { int* p = new int(5); // 没有调用delete } // 每次调用泄漏4字节 ``` 2. 悬空指针问题 ```cpp int* p = new int(10); delete p; *p = 20; // 危险!已释放内存的访问 ``` 3. 错误类型删除 ```cpp Base* b = new Derived; // 多态对象 delete b; // 需要虚析构函数 ``` 五、高级应用场景 1. 自定义内存分配器 ```cpp class CustomAlloc { public: void* operator new(size_t size) { std::cout << "Custom allocation\n"; return ::operator new(size); // 使用全局new[^4] } void operator delete(void* p) { std::cout << "Custom deallocation\n"; ::operator delete(p); } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值