gpt4 book ai didi

c++ - 删除大分配 C++ 时出错

转载 作者:太空宇宙 更新时间:2023-11-04 15:52:54 24 4
gpt4 key购买 nike

我正在尝试使用函数删除内存分配。代码如下...

#include <stdio.h>
#include <iostream>
#include <stdlib.h>

using namespace std;

int NOS, *NO, *SQR;

int Square()
{
SQR = new int [NOS];
if (!SQR)
{
cout<<"Mem Error SQR \n";
exit(0);
}
for ( int i = 0; i < NOS; i++ )
{
SQR[i] = NO[i]*NO[i];
}
}

void ERASE_MEM()
{
if (SQR) delete [] SQR;
cout<<"Deleted 1\n";
if (NO != NULL) delete [] NO;
cout<<"Deleted 2\n";
}

int main ()
{
cout<<"Enter No : ";
cin >> NOS;
NO = new int [NOS];
if (!NO)
{
cout<<"Mem Error NO \n";
exit(0);
}
for ( int i = 0; i < NOS; i++ )
{
NO[i] = 1+i;
}
Square();
delete NO;
ERASE_MEM();
}

如果数字小于 15,程序运行正常,但如果 NOS 大于 15,我会得到以下错误:

* 检测到 glibc ./MEM:双重释放或损坏(顶部):0x097fa008 **

我这样做是为了为所有内存取消分配创建一个函数,我可以在分配内存时调用它。如果分配失败,此函数将取消分配所有先前的分配。

谢谢

最佳答案

您要删除 NO 两次,一次在 main 中,一次在 ERASE_MEM 中。此外,main 中使用的 delete 语法是错误的,因为它是一个数组,您应该使用 delete[](或者最好删除语句) .顺便说一句,还有一件事要注意,当 new 失败时,它不会返回 NULL 指针,而是抛出 std::bad_alloc 异常。因此,没有必要验证从 new 返回的内存位置。另外,函数名不要全部使用大写字母,一般的编码习惯是只对宏使用全部大写的名称。在调用 delete[] 之前也没有必要检查 NULL 指针。标准保证删除 NULL 指针不会执行任何操作。

关于c++ - 删除大分配 C++ 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5025168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com