堆中实例化的数组需要手动销毁释放内存,在栈中实例化的数组,系统自动回收内存
#Coordinate.h
class Coordinate
{
public:
Coordinate();//构造函数
~Coordinate();//析构函数
public:
int m_iX;
int m_iY;
};
#Coordinate.cpp
#include <iostream>
#include "Coordinate.h"
using namespace std;
Coordinate::Coordinate()
{
cout << "Coordinate"<<endl;
}
Coordinate::~Coordinate()
{
cout << "~Coordinate"<<endl;
}
//demo.cpp
#include <iostream>
#include <stdlib.h>
#include "Coordinate.cpp"
using namespace std;
/**
分别从栈中和堆中实例化长度为3的对象数组
给数组中的元素分别赋值
*/
int main(void)
{
Coordinate coor[3];//从栈上实例化对象数组
//从栈中
coor[0].m_iX = 3;
coor[0].m_iY = 5;
//从堆中
Coordinate *p = new Coordinate[3];
p -> m_iX = 7;
p[0].m_iY = 9;//等价于 p->m_iY = 9
p++;//将指针后移一个位置,指向第2个元素
p->m_iX = 11;
p[0].m_iY = 13;
p[1].m_iX = 7;
p++;//将指针后移一个位置,指向第3个元素
p->m_iY = 17;
//栈中对象数组遍历
for(int i =0;i<3;i++)
{
cout << "coor_x:" << coor[i].m_iX <<endl;
cout << "coor_y:" << coor[i].m_iY <<endl;
}
//上面我们对p做了两次++操作,实际p已经指向了第3个元素,应如下操作
//堆中实例化的对象数组遍历。
for(int j = 0; j<3;j++)
{
//cout << "p_x" << p[j].m_iX << endl;
//cout << "p_y" << p[j].m_iY << endl;
cout << "p_y:" << p->m_iY << endl;
cout << "p_y:" << p->m_iY << endl;
p--;
}
//经过了三次循环后,p指向了一个非法内存,不能直接就delete,而应该让p再指向我们申请的一个元素的,如下
p++; //这样p就指向了我们申请的内存
delete []p;
p = NULL;
//system("pause")
return 0;
}