CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

class中的new/delete问题

楼主foniex(天心)2003-12-03 10:54:23 在 VC/MFC / 基础类 提问

下面的这个Class  
  Calss   Test  
  {  
  public:  
      int   *pData;  
      int   Cnt;  
      Test()  
        {  
            pData   =   new   int[10];  
        };  
      ~Test()  
        {  
            delete   pData;  
        }  
   
        Test   operator   -(Test&   B)  
  {  
  Test   result;  
  result.Cnt   =   Cnt;  
                                      for(int   i;i<Cnt;i++)  
                                              *(result.pData+i)   =   *(pData+i)-*(B.pData+i);  
  return   result;  
  };  
        void   SetData(int   i,value)  
        {  
            *(pData+i)   =   value;  
        }  
  };  
   
  void   main(void)  
  {  
        Test   A,B,C;  
        A.Cnt   =   3;  
        B.Cnt   =   3  
        for(int   i=0;i<3;i++)  
        {  
            A.SetData(i,1);  
            B.SetData(i,2);  
        }  
        C=A-B;  
      //   show   A,B,C;    
  }  
  在构造函数和析构函数中分别作new,delete可以吗?能否保证在程序结束的时候pData所使用的内存被正确释放.  
  如何在使用new的时候确认内存分配成功  
   
  Thanks,在线等待  
  问题点数:100、回复次数:22Top

1 楼sujiayi(sujiayi)回复于 2003-12-03 11:01:40 得分 5

~Test()  
        {  
            delete[]   pData;  
        }  
  Top

2 楼osborn(SEANX)回复于 2003-12-03 11:07:13 得分 0

先把pData设为NULL,然后再new,以后用到先判断是否为nullTop

3 楼osborn(SEANX)回复于 2003-12-03 11:14:09 得分 0

简单类型的数组   delete   pData   就够了,当然delete[]   pData更好。Top

4 楼dlfour(游荡四方)回复于 2003-12-03 11:17:50 得分 0

当然要delete[]   pData了,否则会内存泄漏。  
   
  好像在构造函数中new内存不太好。Top

5 楼seilfer2000(郁闷,疯狂学习中)回复于 2003-12-03 11:17:50 得分 0

delete[]   pData     是标准的写法Top

6 楼ISunwu(刀口蒙特)回复于 2003-12-03 11:23:10 得分 5

1、避免重复分配;  
  2、及时释放分配的内存;  
  3、避免使用无效内存,也就是说释放后将指针置为NULL,使用前进行判断;  
  4、每一次分配,应该判断分配是否成功;  
  5、坚持谁分配谁释放的规则,避免遗漏。Top

7 楼foniex(天心)回复于 2003-12-03 11:45:07 得分 0

如果使用了  
      ~Test()  
        {  
            delete   pData;  
        };  
  系统就报告应用程序意外发生终止,把析构函数delete了就没问题了,是在重载操作符的时候的问题,可是解不了  
   
  我现在是在写一个简单的class,作矩阵运算,要求能够依照输入矩阵的大小动态调整内存分配,直到无可用内存的时候则报错。而且运行完毕能自动释放内存  
  Top

8 楼osborn(SEANX)回复于 2003-12-03 11:50:15 得分 0

 
        Test   operator   -(Test&   B)  
  {  
  Test   result;  
  result.Cnt   =   Cnt;  
                                      for(int   i;i<Cnt;i++)   //   呵呵,i   初值?  
   
                                              *(result.pData+i)   =   *(pData+i)-*(B.pData+i);  
  return   result;  
  };Top

9 楼bluebohe(薄荷)回复于 2003-12-03 11:52:59 得分 0

同意楼上意见delete[]   pData;   同时减操作符有问题要返回引用Top

10 楼osborn(SEANX)回复于 2003-12-03 11:57:14 得分 0

呵呵,我也同意用delete[]   pData;   (小声的说:楼主的这个程序用delete   pData也不会错)Top

11 楼foniex(天心)回复于 2003-12-03 12:09:03 得分 0

To   osborn  
        i的初值是写帖子的时候忘记了写的,实际是有的,令for(int   i=0;i<3;i++)在析构的时候还是有问题的。  
   
  to   blebohe:  
      那该如何写重载函数呢?  
   
   
   
  Top

12 楼osborn(SEANX)回复于 2003-12-03 12:40:49 得分 30

Test&   operator   -   (Test&   B)  
  {  
                  for(int   i   =   0;i<Cnt;i++)  
  *(pData+i)   =   *(pData+i)-*(B.pData+i);  
   
  return   *this;  
  };  
         
        Test&   operator   =(Test&   B)  
  {  
  memcpy(pData,   B.pData,   10);  
  Cnt   =   B.Cnt;  
  return   *this;  
  };  
   
  Test   B,C;  
  C.Cnt   =   3;  
  B.Cnt   =   3;  
  for(int   i=0;i<3;i++)  
  {  
  C.SetData(i,1);  
  B.SetData(i,2);  
  }  
  C=C-B;Top

13 楼ISunwu(刀口蒙特)回复于 2003-12-03 13:09:47 得分 0

严重统一楼上的。Top

14 楼ISunwu(刀口蒙特)回复于 2003-12-03 13:15:15 得分 0

osborn(osborn)    
  你的和搂住的要求不一致,你那样做会修改A的值。所以不能满足要求。  
  而楼主重载   -   操作符时使用了局部对象,当这个对象析构时释放了对应的内存,故而导致后面出错。Top

15 楼ISunwu(刀口蒙特)回复于 2003-12-03 13:18:38 得分 40

建议改正如下:  
  class   Test  
  {  
  public:  
  int   *pData;  
  int   Cnt;  
  int   nRef;                       //   引用计数  
  Test()  
  {  
  pData   =   new   int[10];  
  nRef   =   1;   //   设为1  
  };  
  ~Test()  
  {  
  if(--nRef   <=   0)     //   只有在不再被使用的情况下才释放内存  
  delete   []pData;  
  };  
   
  Test   operator   -(Test&   B)  
  {  
  Test   result;  
  result.Cnt   =   Cnt;  
  for(int   i=0;i<Cnt;i++)  
  *(result.pData+i)   =   *(pData+i)-*(B.pData+i);  
  result.nRef   ++;     //   增加引用计数  
  return   result;  
  };  
  const   Test   &   operator   =   (Test   src)  
  {  
  memcpy(pData,   src.pData,   10);  
  src.nRef   --;         //   降低引用计数  
  return   *this;  
  }  
   
   
  void   SetData(int   i,int   value)  
  {  
  *(pData+i)   =   value;  
  }  
  };Top

16 楼foniex(天心)回复于 2003-12-03 15:08:20 得分 0

to     ISunwu:  
  run   下面的code,  
  C.pData内没有数据阿  
      void   main(void)  
  {  
        Test   A,B,C;  
        A.Cnt   =   3;  
        B.Cnt   =   3;  
        for(int   i=0;i<3;i++)  
        {  
            A.SetData(i,2);  
            B.SetData(i,1);  
        }  
        C=A-B;  
        A.ShowData();B.ShowData();  
      C.ShowData();  
  }Top

17 楼fuxf(布衣)回复于 2003-12-03 15:19:14 得分 0

Test()  
        {  
            pData   =   new   int[10];  
        };  
      ~Test()  
        {  
            delete   []   pData;  
        }  
  effective   C++   写的关于内存释放很不错Top

18 楼ISunwu(刀口蒙特)回复于 2003-12-03 16:46:49 得分 0

楼主,ShowData()是个什么东东阿?Top

19 楼foniex(天心)回复于 2003-12-10 10:23:37 得分 0

ShowData(),显示数据的函数罢了,和操作符重载部分没有关系的Top

20 楼lightwell(大道不过两三行)回复于 2003-12-10 11:23:40 得分 0

应该用引用计数Top

21 楼Goldcastle(金城)回复于 2003-12-10 11:46:30 得分 20

这是我写的  
  CMatrix::CMatrix()  
  {  
  m_rows=1;  
  m_cols=0;  
  m_rep=new   double   *[1];  
  m_rep[0]=new   double[1];  
  }  
  CMatrix::CMatrix(int   r,int   c)  
  {  
  m_rows=r;  
  m_cols=c;  
  m_rep=new   double   *[r];  
  for(int   i=0;i<r;i++)  
  {  
  m_rep[i]=new   double[c];  
  for(int   j=0;j<c;j++)  
  m_rep[i][j]=0.0;  
  }  
  }  
  CMatrix::CMatrix(double   **array,int   r,int   c)  
  {  
  m_rows=r;  
  m_cols=c;  
  m_rep=new   double   *[r];  
  for(int   i=0;i<r;i++)  
  {  
  m_rep[i]=new   double[c]   ;  
  for(int   j=0;j<c;j++)  
  m_rep[i][j]=array[i][j];  
  }  
   
  }  
  CMatrix::CMatrix(CMatrix   &A)  
  {  
  m_rows=A.m_rows;  
  m_cols=A.m_cols;  
  m_rep=new   double   *[m_rows];  
  for(int   i=0;i<m_rows;i++)  
  {  
  m_rep[i]=new   double[m_cols];  
  for(int   j=0;j<m_cols;j++)  
  m_rep[i][j]=A.m_rep[i][j];  
  }  
  }  
  CMatrix::~CMatrix   ()  
  {  
  delete   *m_rep;  
  delete   m_rep;  
  }  
  CMatrix   CMatrix::operator-(CMatrix   &A)  
  {  
  CMatrix   B(m_rows,m_cols);  
  if(m_rows==A.m_rows&&m_cols==A.m_cols)  
  for(int   i=0;i<m_rows;i++)  
  for(int   j=0;j<m_cols;j++)  
  B.m_rep[i][j]=m_rep[i][j]-A.m_rep[i][j];  
  else TRACE("error   CMatrix   for   -\n");  
  return   B;  
   
  }  
  double*   CMatrix::operator[](int   i)  
  {  
  return   m_rep[i];  
  }  
  Top

22 楼foniex(天心)回复于 2003-12-15 16:30:00 得分 0

感谢诸位Top

相关问题

  • 关于 class 中的 class function
  • servlet中class not found
  • delete this
  • delete this?
  • class中的常量
  • class class
  • >>>>>>>Dll 中Class 的问题
  • class$中的$什么意思?
  • pl/sql 中 delete 记录
  • STL中的delete问题

关键词

  • pdata
  • cnt
  • delete
  • test
  • result

得分解答快速导航

  • 帖主:foniex
  • sujiayi
  • ISunwu
  • osborn
  • ISunwu
  • Goldcastle

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo