下面的这个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,在线等待

解决方案 »

  1.   

    ~Test()
       {
         delete[] pData;
       }
      

  2.   

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

  3.   

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

  4.   

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

  5.   

    delete[] pData  是标准的写法
      

  6.   

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

  7.   

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

  8.   


       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;
    };
      

  9.   

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

  10.   

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

  11.   

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

  12.   

    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;
      

  13.   

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

  14.   

    建议改正如下:
    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;
    }
    };
      

  15.   

    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();
    }
      

  16.   

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

  17.   

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

  18.   

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

  19.   

    这是我写的
    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];
    }