LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1155|回复: 9

请教一个c++的问题,delete 在何时不能正常工作??

[复制链接]
发表于 2006-6-16 14:57:06 | 显示全部楼层 |阅读模式
最近在写一个小程序,读取DXF中的内容。工具:MS studio 2003 .net,OS:Windows XP SP2 ,没有使用.net托管,对其不熟悉,而且也不太愿意用托管。
我在程序中用了一个动态申请的二维数组
大概过程如下:
int m;
int n;  //m,n是用来记录网格的两个方向上的节点数
//CVertex 是一个定义节点的一个类
CVertex **pControlVertexMesh =new CVertex * [m];
pControlVertexMesh[0]=new CVertex [m*n];
for(int i=1;i<m;i++)
    pControlVertexMesh=pControlVertexMesh[i-1]+n;

////读取
//下面就是读取DXF的内容,并把读取的内容填充到数组中去,CVertex的每个数据成员都是私有的,填充是都是调用接口函数
.......
/////

/////其他操作,这一部分还没有进行到,即这一部分不影响内存的释放
........
///////

//释放数组
delete []pControlVertexMesh[0];  //释放节点数组
delete []pControlVertexMesh;      //释放指针数组

-------------------------------
以上在释放内存时不能正常释放,动态申请的数组所占的内存空间全没有释放,而且看到一个奇怪的现象就是
pControlVertexMesh[0] 所指向的内存空间大小应该为sizeof(CVertex)*m*n;可是探测到的内存空间大小为sizeof(CVertex)*m*n+4,即多了一个指针的

以上的问题盼高手指点一下,不胜感激!!!
 楼主| 发表于 2006-6-17 17:23:49 | 显示全部楼层
怎么没人回??
救命啊
帮我一把吧
回复 支持 反对

使用道具 举报

发表于 2006-6-17 22:47:11 | 显示全部楼层
把 new,delete 放到一个类的构造,析构函数里试下


大小,你自己算的? 程序输出的 ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-19 15:44:59 | 显示全部楼层
谢谢Windwiny,你的方法我没有试过
但是我试过不进行填充操作,申请后就立即释放内存,则不存在内存泄漏。

我的代码中其实有两处内存泄漏,一个是申请的CVertex数组,还有一个是申请的CVertex *数组,这两片内存都不能释放。

泄漏的内存的大小是有vs的调试器给出的,CVertex数组占用的内存大小和我计算的相差4个byte,而指针数组占用的空间则和计算结果相同,大小为4*countm,(sizeof(CVertex *)=4。

还请你和其他高手继续帮忙,谢谢!
回复 支持 反对

使用道具 举报

发表于 2006-6-20 12:36:06 | 显示全部楼层
你那个类什么什么东西? 是不是 它自己管理 内存的 ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-22 11:12:33 | 显示全部楼层
Post by windwiny
你那个类什么什么东西? 是不是 它自己管理 内存的 ?

谢谢!
你是说CVertex这个类吗?
这个类中没有使用指针,是一些基本类型的数据和一个类CDXFVec3f,析够函数为空。
两个类的声明如下:
CDXFVec3f
{

}

请教下自己管理内存是不是就是在自己构造函数中new一片空间,然后析够函数中delete掉????内存管理还不熟悉,请别见笑,不对之处请指教,谢谢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-22 11:22:14 | 显示全部楼层
Post by windwiny
你那个类什么什么东西? 是不是 它自己管理 内存的 ?

谢谢!
你是说CVertex这个类吗?
这个类中没有使用指针,是一些基本类型的数据和一个类CDXFVec3f,析够函数为空。
两个类的声明如下:
CDXFVec3f
{
public:
   CDXFVec3f();
   CDXFVec3f(double _x,double _y,double _z);

public:
   double x,y,z;
};

CVertex{
public:
   CVertex();  //将所有成员全置零
   ////一些设置成员变量的函数
   void SetCoords(CDXFVec3f &v);
   .......................//其他的类似函数,略
   void GetCoords(CDXFVec3f &v);
   .....................//其他的类似函数,略

private:
   CDXFVec3f Coords;
   double StartWidth;
   double EndWidth;
   double Bugle;
   int Flag;
   double CurveFitTagentDirection;
   int Indices[4];  
};

请教下自己管理内存是不是就是在自己构造函数中new一片空间,然后析够函数中delete掉????内存管理还不熟悉,请别见笑,不对之处请指教,谢谢。
回复 支持 反对

使用道具 举报

发表于 2006-6-22 14:04:25 | 显示全部楼层
int m;
int n;
CVertex **pControlVertexMesh =new CVertex *[m];
for (int i = 0; i < m; i++)
{
       pControlVertexMesh=new CVertex[n];
}

//...........

for (int j = 0; j < m; j++)
{
       delete []pControlVertexMesh[j];
}
delete []pControlVertexMesh;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-22 16:38:36 | 显示全部楼层
Post by stylev
int m;
int n;
CVertex **pControlVertexMesh =new CVertex *[m];
for (int i = 0; i < m; i++)
{
       pControlVertexMesh=new CVertex[n];
}

//...........

for (int j = 0; j < m; j++)
{
       delete []pControlVertexMesh[j];
}
delete []pControlVertexMesh;

谢谢先!
这也是动态申请二维数组的一种方法,但是分配的内存不连续,不方便以后的复制(memcpy),所以我没有采用这种方法。我还没有试过这种方法,也许不会造成内存泄漏,一会儿试试看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-26 21:26:17 | 显示全部楼层
问题解决,谢谢各位。
其实我sb了,申请了两次内存
改写成stylev的方法的时候才发现的
又改回来了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表