下面的这个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,在线等待
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,在线等待
解决方案 »
- 平时编程用苹果笔记本不靠谱吧?
- 请教一下 HBITMAP 和HDIB的区别是什么?
- if (!ProcessShellCommand(cmdInfo))出错了!
- 怎么样把bmp图片显示在单文档工程的视图中
- 拨号成功后在Tray上显示了一个通知的Tip.怎么做(Icon的位置)?
- 关于编码规范(还有点别的)
- 数据库开发选择?
- 有谁现在 windows 计划任务 .job 的文件格式????
- HRESULT insertBefore(...)如何用?
- 加载一张bmp到内存后,如何截取指定像素大小并保存
- 怎么得到CreateFont里的默认字体宽度?(实在没分了,请原谅)
- 从树型控件上发消息改变对话框的焦点到编辑控件上为什么没反映?
{
delete[] pData;
}
2、及时释放分配的内存;
3、避免使用无效内存,也就是说释放后将指针置为NULL,使用前进行判断;
4、每一次分配,应该判断分配是否成功;
5、坚持谁分配谁释放的规则,避免遗漏。
~Test()
{
delete pData;
};
系统就报告应用程序意外发生终止,把析构函数delete了就没问题了,是在重载操作符的时候的问题,可是解不了我现在是在写一个简单的class,作矩阵运算,要求能够依照输入矩阵的大小动态调整内存分配,直到无可用内存的时候则报错。而且运行完毕能自动释放内存
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;
};
i的初值是写帖子的时候忘记了写的,实际是有的,令for(int i=0;i<3;i++)在析构的时候还是有问题的。to blebohe:
那该如何写重载函数呢?
{
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;
你的和搂住的要求不一致,你那样做会修改A的值。所以不能满足要求。
而楼主重载 - 操作符时使用了局部对象,当这个对象析构时释放了对应的内存,故而导致后面出错。
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;
}
};
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();
}
{
pData = new int[10];
};
~Test()
{
delete [] pData;
}
effective C++ 写的关于内存释放很不错
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];
}