【Effective C++】学习之:new和delete、动态二维数组

本文详细介绍了C++中的new与delete操作符的正确使用方法,探讨了内存泄漏的问题及其对程序运行的影响,并提供了创建及管理动态二维数组的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.new 与delete

 C++中应该使用配套的new和delete,规则:如果你在调用new时使用了[ ],则你必须在调用delete时也使用[ ],如果你在调用new的时候没有使用[ ],那么你也不应该在调用delete时使用[ ]。如:

string *strPtr1=new string;
string *strPtr2=new string[10];
...
delete strPtr1;         //删除单一对象
delete [] strPtr2;      //删除整个对象数组

注意:如果一个指针是空指针,即null指针,不能对它使用delete删除。

2.内存泄漏

情况一:如果用动态编码机制申请了一个动态变量,但是之后不需要使用这个动态变量时没有用delete;
情况二: 把一个动态编码的地址放入了一个指针变量,而在此变量没有delete之前,又让指针指向了另外一个 动态变量,这样原来那块空间就丢失了。堆管理器就认为你还在继续使用它们,而你现在已经不知道原来的动态变量所在地址。

 对于一些小程序内存泄漏可能不重要,但是对于需要几天甚至半个月才能运行完的程序,如果存在内存泄漏,这样程序最终可能会耗尽所有内存,直至崩溃。

3.动态二维数组

 C++不支持直接申请动态二维数组。申请一个动态的二维数组需要程序员自己解决。
 最简单的方法是将二维数组转换成一维数组,比如a[3][4]的二维数组,申请一个a[12]的一维数组,如果要访问二维数组的第i行第j列的元素时,通过4*i+j实现访问二维数组中的元素,这种方法的缺点是不能直接通过二维数组的下标变量的形式访问二维数组的元素。
 其实a[3][4]是三个元素组成的整型指针,其中的每个元素如a[0]指向一个数组,这个数组又包含4个元素,也就是指向整型的指针的指针。
例子:申请动态二维数组

#include <iostream>
using namespace std;

int main()
{  int **a, i, j, k = 0;               //a是动态数组的名字

   a = new int *[3];                   //申请指向每一行首地址的指针
   for (i = 0; i < 3; ++i)             //为每一行申请空间
       a[i] = new int[4];

   for (i = 0; i < 3; ++i)             //为动态数组元素赋值
       for (j = 0; j < 4; ++j)
           a[i][j] = k++;

   for (i = 0; i < 3; ++i) {       // 输出动态数组
       cout << endl;
       for (j = 0; j < 4; ++j)
           cout << a[i][j] << '\t';//'\t'表示制表符,即一个Tab键的距离
   }

   for (i = 0; i < 3; ++i)         //  释放每一行
       delete [] a[i];
   delete [] a;                    //  释放保存每一行首指针的数组

   return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值