为什么我的程序的动态数组输入2万5个数据会内存泄露?还有另一个程序测试运行时间有点问题

时间:2023-02-11 17:41:56
原代码

#include<iostream>
#include"time.h"
using namespace std;

void merge(int A[],int low,int mid,int high,int n)
{
int *B=new int[n];
int l=low;int m=mid+1;int k=low;
while(l<=mid&&m<=high)
{
if(A[l]<=A[m])
{
B[k]=A[l];
l++;
}
else
{
B[k]=A[m];
m++;
}
k++;
}
if(l==mid+1)
while(k<=high)
{
B[k]=A[m];
k++;m++;
}
else
while(k<=high)
{
B[k]=A[l];
k++;l++;
}
for(int i=low;i<=high;i++)
{
A[i]=B[i];
}
};

void mergesort(int A[],int low,int high,int n)
{
if(low<high)
{
int mid=(low+high)/2;
mergesort(A,low,mid,n);
mergesort(A,mid+1,high,n);
merge(A,low,mid,high,n);
}
};

void main()
{
srand(time(NULL));
int i,j;
double Time;
for(i=1;i<=5;i++)
{
int *A=new int[5000*i];
for(j=0;j<(5000*i);j++)
A[j]=rand()%100000;

clock_t Start=clock(); 
mergesort(A,0,(5000*i)-1,4000*i);
clock_t Finish=clock();


cout<<endl;
        cout<<"随机输入"<<5000*i<<"个数据的运行时间"<<endl;
cout<<"Running time is:"<<static_cast<double>(Finish-Start)/CLOCKS_PER_SEC*1000<<"ms"<<endl;
cout<<"\n\n\n";
delete [] A;
}
}

这是一个测试运用mergesort(归并)排序算法测试数据的运行时间的程序

问题是,当输入的数据为2W5个时,就提示内存泄漏.
明明我每次new A数组时,都再每次循环的最后释放掉A的内存了。。怎么还是内存泄漏

===========================================================================
#include<iostream>
#include"time.h"
using namespace std;

int split(int A[],int low,int high,int w)
{
int i=low;
int x=A[low];
int temp;
for(int j=low+1;j<=high;j++)
{
if(A[j]<=x)
{
i++;
if(i!=j)
{
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
}
temp=A[low];
A[low]=A[i];
A[i]=temp;
w=i;
return w;
}

void quicksort(int A[],int low,int high)
{
int w;
if(A[low]<A[(low+high)/2])
if(A[(low+high)/2]<A[high])
w=(low+high)/2;
else
if(A[low]<A[high])
w=high;
else
w=low;
else
if(A[high]>A[low])
w=low;
else
if(A[high]>A[(low+high)/2])
w=high;
else
w=(low+high)/2;
if(low<high)
{
w=split(A,low,high,w);
quicksort(A,low,w-1);
quicksort(A,w+1,high);
}
}


void main()
{
srand(time(NULL));
int i,j;
double Time; 
for(i=1;i<=5;i++)
{
int *A=new int[5000*i];
for(j=0;j<(5000*i);j++)
A[j]=rand()%100000;

clock_t Start=clock(); 
quicksort(A,0,(5000*i)-1);
clock_t Finish=clock();


cout<<endl;
cout<<"随机输入"<<5000*i<<"个数据的运行时间"<<endl;
cout<<"Running time is:"<<static_cast<double>(Finish-Start)/CLOCKS_PER_SEC*1000<<"ms"<<endl;
        delete [] A;
}
}

这是第二个程序,是测试快速排序在输入数据为5K,1W,1W5,2W,2W5的运行时间,但很奇怪的是,为什么出来的结果总是有4个运行时间是0ms?不是应该是随着输入数据量的增大,运行时间也会随着增加的么?感觉是测试时间的那个函数出了点问题,但是在第一个程序中,这个测试运行时间的函数好像又可以正常使用。。


感觉很奇怪。。。

7 个解决方案

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

单步调试和设断点调试是程序员必须掌握的技能之一。

#2


会不会临时变量太多了。你用的IDE没有准备提供足够的栈给你用。

#3


引用 2 楼  的回复:
会不会临时变量太多了。你用的IDE没有准备提供足够的栈给你用。


其实我也觉得也有这种可能,因为最最重要的一点是,运行5K,1W,1W5K,2W个数据都没有问题,但就是2W5之后的都出现内存泄漏

#4


呃。。。有人能帮忙看看第二个程序是什么问题么。。

#5


第一个程序
merge函数中申请的临时数组B,在函数结束的时候没释放。
每次去merge都要多申请一次B,怎么吃的消

#6


第二个程序,前面4组数据出现0毫秒很正常,对快速排序来说50000个整数排序0毫秒也不奇怪

#7


谢谢楼上的朋友解答,问题已经解决~谢谢各位~

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

单步调试和设断点调试是程序员必须掌握的技能之一。

#2


会不会临时变量太多了。你用的IDE没有准备提供足够的栈给你用。

#3


引用 2 楼  的回复:
会不会临时变量太多了。你用的IDE没有准备提供足够的栈给你用。


其实我也觉得也有这种可能,因为最最重要的一点是,运行5K,1W,1W5K,2W个数据都没有问题,但就是2W5之后的都出现内存泄漏

#4


呃。。。有人能帮忙看看第二个程序是什么问题么。。

#5


第一个程序
merge函数中申请的临时数组B,在函数结束的时候没释放。
每次去merge都要多申请一次B,怎么吃的消

#6


第二个程序,前面4组数据出现0毫秒很正常,对快速排序来说50000个整数排序0毫秒也不奇怪

#7


谢谢楼上的朋友解答,问题已经解决~谢谢各位~