动态二维数组一个很奇怪的问题,内存泄露还是???

最近遇到的问题,具体如下:

 #include <iostream>
using namespace std;

typedef void(*P[10])(bool& flag);
#define N 10000
#define M 10000

template<class T>
void fun(bool& flag)
{
int i;
static T** p=nullptr;

switch (flag)
{
case false:
p = (T**)new T*[N];
for (i = 0; i < N; i++)
p[i] = (T*)new T[M];
break;

case true:
for (i = 0; i < N; i++)
{
delete[] p[i];
p[i] = nullptr;
}
delete[] p;
p = nullptr;
break;
}
flag ^= true;
}

int main()
{
P pt;
pt[0] = fun<int>;
pt[1] = fun<char>;
pt[2] = fun<__int64>;
pt[3] = fun<float>;
pt[4] = fun<double>;

int i=0,j;

system("pause");
while(i < 5)
{
bool flag = false;
for (j = 0; j < 6; j++)
pt[i](flag);
i++;
}
system("pause");
return 0;
}

执行情况如下:

为什么内存增长了这么多 。

#include <iostream>
using namespace std;

typedef void(*P[10])(bool& flag);
#define N 100000000
//#define M 10000

template<class T>
void fun(bool& flag)
{
	int i;
	static T** p=nullptr;

	switch (flag)
	{
	case false:
		p = (T**)new T*[N];
//		for (i = 0; i < N; i++)
	//		p[i] = (T*)new T[M];
		break;

	case true:
//		for (i = 0; i < N; i++)
//		{
//			delete[] p[i];
//			p[i] = nullptr;
//		}
		delete[] p;
		p = nullptr;
		break;
	}
	flag ^= true;
}

int main()
{
	P pt;
	pt[0] = fun<int>;
	pt[1] = fun<char>;
	pt[2] = fun<__int64>;
	pt[3] = fun<float>;
	pt[4] = fun<double>;

	int i=0,j;

	system("pause");
	while(i < 5)
	{
		bool flag = false;
		for (j = 0; j < 6; j++)
			pt[i](flag);
		i++;
	}
	system("pause");
	return 0;
}

如果改成这样,执行如下:

为什么内存又不增长

时间: 2024-08-03 12:33:46

动态二维数组一个很奇怪的问题,内存泄露还是???的相关文章

C语言批量数据到动态二维数组

上一篇文章将文件读取放到静态创建的二维数组中,可是结合网络上感觉到今天的DT时代,这样批量大量读取一个上百行的数据,分配的内存是否可能由于大量的数据而产生溢出呢,近期一直研究里malloc函数.通过它来动态建立所需的二维数组.因此.通过文件操作和动态创建二维数组结合起来,将大量的数据动态的放入矩阵中,不知道这种思想是否正确,下午把程序执行出来了.将程序贴上来.欢迎大家一起探讨:对于有规律的大数据txt文档怎样高效而准确的读入数组或矩阵中呢???指教!.谢谢 程序: #include<stdio.

以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简单分析动态二维数组,若有不足或错误之处,还请指出! 在讲这之前,以一维数组为例,先重新认识一下数组: int array[5] = {1, 2, 3, 4, 5}; 首先数组名称是该数组的首地址常量,即数组名称就是指针,就有&array[0] == array! 那么我们可以推出*array ==

vector动态二维数组(容器的容器)占用内存分析

之前在这里写过一篇"C++中的动态二维数组".在C++中没有动态二维(多维)数组.但是根据原理我们可以自己创建. 在看过STL的vector源代码后"<STL源码剖析>---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组. 创建一个2x4的二维数组.想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列). int row=2,col=4; vector<vector<int> &g

创建动态二维数组

1 //======================================================== 2 //创建动态二维数组a [M] [N]: 3 //思路一:二维数组的抽象理解: 4 //思路二:二维数组在内存中实际排列: 5 //======================================================== 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <

c++动态二维数组(原地址:http://blog.sina.com.cn/s/blog_4e7ae8ca0100zqq6.html)

C++中用new动态创建二维数组的格式一般是这样: TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数.采用这种格式,列数必须指出,而行数无需指定.在这里,p的类型是TYPE*[N],即是指向一个有N列元素数组的指针. 还有一种方法,可以不指定数组的列数: int **p;p = new int*[10];    //注意,int*[10]表示一个有10个元素的指针数组for (int i = 0; i != 10; ++i){    p[

动态申请和释放一个二维数组

动态申请一个二维数组也很常见,下面是常见的两种形式. //方法1 unsigned char** pImg= new unsigned char*[m]; for(int i=0;i<m;i++){ pImg[i]=new unsigned char[n]; } //方法2 unsigned char** pImg= new unsigned char*[m]; unsigned char* arr= new unsigned char[m*n]; for(int i=0;i<m;i++){

&lt;细节&gt;动态创建二维数组

今天在做一个关于数组相似度的题目,需要动态创建二维数组,刚开始想用常规的int a[ ][ ]建立,但很快就发现行不通,这种常规数组必须在编译前指定数组的维数,而这个题目在的维数必须在运行中计算得出,于是想到采用new来建立动态二维数组,这个方法行得通,但是很麻烦,也不太利于理解,后面决定采用vector< vector< int > >方法来创建,简单了不少,下面对两种方法都进行一下总结. 1.使用vector创建二维数组 #include <iostream> #i

有关动态多维数组的一个问题

同样的错误,即使你的年龄越大,它会犯同样的,Opps............ 最近做的C#和C++混合编程.昨天上演了一出栈平衡了很长一段时间,今天,我们攻克了BUG.既高兴又伤心. 看看代码: unsigned char*** bytes2D=(unsigned char***)bytesArray; for(int i=0;i<height/2;i++) { for(int j=0;j<scanStride/3;j++) { tmp=bytes2D[i][j][0]*0.114+bytes

一个关于动态多维数组的问题

同样的错误,即使你年龄再大,也一样会犯,Opps............ 最近在做C#和C++的混合编程.昨天搞了堆栈平衡搞了好久,今天又解决了一个BUG,既开心又难过. 先看代码: unsigned char*** bytes2D=(unsigned char***)bytesArray; for(int i=0;i<height/2;i++) { for(int j=0;j<scanStride/3;j++) { tmp=bytes2D[i][j][0]*0.114+bytes2D[i][