动态存储
堆空间的使用
- 堆对象是在程序运行时根据需要随时可以被创建或删除的对象
- 当创建堆对象时,堆中的一个存储单元从未分配状态变为已分配状态
- 当删除堆对象时,存储单元从分配状态又变为未分配状态,可供其他动态数据使用
new 和 delete 的语法
new T(初始值);
new T[E];
delete 指针变量;
delete [] 指针变量;
- 创建和删除堆对象:算符new分配堆内存,如果成功,则返回指向该内存空间的首地址,如果失败,则返回NULL。所以每次使用运算符new动态分配内存时,都应测试new的返回指针值
- 创建和删除堆对象数组:从堆上分配对象数组,只能调用无参构造函数(包括默认构造函数),不能调用其他任何构造函数
- 使用堆空间的原因
(1)直到运行时才能知道需要多少对象空间
(2)不知道对象的生存期到底有多长
(3)直到运行时才知道一个对象需要多少内存空间
浅拷贝与深拷贝
- 默认拷贝构造函数可以用一个已有对象初始化一个新建立的同类对象。当对象的数据成员是简单数据类型时,默认构造函数可以做得很好
- 当一个对象拥有的资源是由指针指示的堆时,默认拷贝构造函数仅作指针拷贝,而不重新分配内存空间;当对象作用域结束后,析构函数又会重复释放堆,将产生错误:需要使用用户自定义的拷贝构造函数
无名对象
class Student {
public:
Student(string name): name(name) {
cout << "构造函数" << endl;
}
Student(const Student &obj) {
cout << "拷贝构造函数" << endl;
}
~Student() {
cout << "析构函数" << endl;
}
string getName() const {
return name;
}
private:
string name;
};
int main(int argc, char *argv[], char *envp[]) {
Student &rStu = Student("kitty");
cout << rStu.getName() << endl;
rStu.~Student();
system("pause");
return 0;
}
class Student {