C++中避免内存泄露常见的解决方式
作者:网络转载 发布时间:[ 2015/2/25 15:12:16 ] 推荐标签:C++ 内存泄露
case 3:在释放对象数组时,没有使用delete [];
1>对于单个对象,单个基本类型(如int,double等)的变量,我们肯定?用delete,不会出错;
2>对于基本类型数组,因为不须要大小?数,因而,?用delete或array delete(delete []),均能够,如上例中,我便直接?用了delete m_variety,建议为了统一,?用delete []m_variety;
3>对于自己定义的对象所组成的对象数组,则一定要?用array delete,这样编译器才会在释放内存前调用每一个对象的析构函数,并调用
free释放对象数组空间;
for example:
#include <iostream>
#include <string>
class Point
{
public:
Point(int x = 0, int y = 0, char *col = "Red");
~Point();
protected:
private:
int m_x;
int m_y;
char *m_color;
};
Point::Point(int x, int y, char *col)
: m_x(x), m_y(y)
{
m_color = new char[strlen(col) + 1];
strcpy(m_color, col);
}
Point::~Point()
{
delete []m_color;
std::cout << "In the deconstuctor of Point!/n";
}
int main(int argc, char *argv[])
{
cout << "case 3:/n";
Point *p = new Point[5];
delete p;
// 正确方法:
// delete []p;
return 0;
}
case 4:
指向由指向对象的指针构成的数组不等同于与对象数组。
也是说,数组的基本类型是指向对象的指针,此时,是用delete 还是delete [](array delete),并不重要,关键是指针并没有析构函数,必须用户自己调用delete语句.
for example:
// Point类和case 3一样;
int main(int argc, char *argv[])
{
cout << "case 4:/n";
Point **pPtrAry = new Point*[10];
// 循环为每一个指针分配一个Point对象;
int i = 0;
for (; i < 10; ++i)
{
pPtrAry[i] = new Point(i, i, "Green");
}
// 以下语句并没有释放10个Point对象,释放的仅仅是他们的指针所组成的数组
// 占用的10*sizeof(Point*) 空间,造成了内存泄露
// (180 = 10*sizeof(Point) + 10* 6; (6= sizeof("Green")))
// delete []pPtrAry;
// 正确的方法:
for (i = 0; i < 10; ++i)
{
delete pPtrAry[i];
}
delete []pPtrAry; // 或者delete pPtrAry;
return 0;
}
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。

sales@spasvo.com