内存释放回

本文详细解释了C++中动态分配内存的概念,包括如何正确使用`delete`和`delete[]`来释放内存,以及不当使用可能导致的内存泄漏问题。重点介绍了动态分配数组的正确使用方式和内存泄漏的防范措施。

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

当我们做了一个动态分配的变量,我们需要明确告诉C++内存释放回。这是通过标量非数组的删除算子形式
1
2
delete pnValue; // unallocate memory assigned to pnValue
pnValue = 0;

注意,删除操作不会删除该指针-它删除指针所指向的内存!

动态分配数组

动态数组的声明让我们运行程序时选择自己的大小。动态分配数组,我们使用新的和删除数组形式(通常称为新的[ ]和[ ]删除):

1
2
3
4
int nSize = 12;
int *pnArray = new int[nSize]; // note: nSize does not need to be constant!
pnArray[4] = 7;
delete[] pnArray;

因为我们是分配一个阵列,C++知道应使用新的而不是新的标量版阵列版。从本质上讲,新的运营商称为[ ],[ ]即使不放在旁边的新关键字。

当删除动态分配的数组,我们不得不使用阵列版本删除,并删除[ ]。这会告诉CPU,需要清理的多变量而不是一个单一的变量。

值得注意的是,数组的访问做同样的方式与动态分配的数组与普通数组。虽然这看起来有点滑稽,因为pnarray显式声明为指针,记住阵列是真的只是在C++中指针吧。

不这样做!使用标量版本的阵列上的删除会导致数据损坏或其它问题。内存泄漏

内存泄漏

动态分配的内存实际上没有范围。那是,它保持分配直到显式释放或直到程序结束。然而,指针用于访问动态内存分配遵循正态变量的作用域规则。这种不匹配可以创造出有趣的问题。

考虑下面的函数:

动态数组的声明让我们运行程序时选择自己的大小。动态分配数组,我们使用新的和删除数组形式(通常称为新的[ ]和[ ]删除):

1
2
3
4
void doSomething()
{
    int *pnValue = new int;
}

此函数分配一个整数动态,但从来没有让它使用删除。因为指针遵循正态变量,函数结束时,pnvalue将超出范围。因为pnvalue是唯一的变量的动态分配的整数地址,当pnvalue破坏没有指向动态分配的内存。这就是所谓的内存泄漏。作为一个结果,动态分配的整数不能删除,从而不能被重新分配或重新。内存泄漏吃免费的内存运行程序时,使更少的内存不仅可以对这一计划,但其他的程序以及。严重的内存泄漏问题的方案,可以吃所有可用的内存,导致整个机器运行缓慢甚至崩溃。

内存泄漏也如果指针的动态分配的内存地址重新分配到另一个值的结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值