class中的new/delete问题
下面的这个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




