动态对象创建
C语言中malloc和free的问题:
1. 程序员必须确定对象的长度;
2. malloc 返回一个 void*指针,C++不允许将 void*赋值给其他任何指针, 故必须强转;
3. malloc 可能申请内存失败, 所以必须判断返回值来确保内存分配成功;
4. 用户在使用对象之前必须记住对他初始化, 构造函数不能显示调用初始化(构造函数是由编译器调用), 用户有可能忘记调用初始化函数。
new operator
new 会返回一个该类型的指针。
默认调用构造函数,开辟空间,返回不是void*,不要强制转换
delete 释放
new 对象用 void* 去接收,释放不了对象
new 出来的是数组,如何释放?delete [] ...
new 出来的是数组,肯定调用默认构造
Person * person = new Person;//堆区开辟
相当于:
Person* person = (Person*)malloc(sizeof(Person));
if(person == NULL){
return 0;
}
person->Init();//构造函数
New操作符能确定在调用构造函数初始化之前内存分配是成功的,所以不用显示确定调用是否成功。
所有new出来的对象, 都会返回该类型的指针。
malloc 返回 void* 还要强转。
malloc 会调用构造吗? 不会。
new 默认调用构造函数,开辟空间,返回不是void* ,不需要强转。
new 运算符; malloc 函数。
释放 堆区空间
delete p2;
delete 运算符 要配合 new 使用; malloc 配合 free 用
通过new开辟数组, 一定会调用默认构造函数,故一定要提供默认构造函数
Person006* pArray = new Person006[10];
在栈上开辟数组, 可以指定有参构造
Person006 pArray[2] = { Person006(1),Person006(2)};
如果在 new 表达式中使用[], 必须在相应的 delete 表达式中也使用 []。如果在 new 表达式中不使用 [] ,一定不要在相应的 delete 表达式中使用 []。
class Person006 {
public:
Person006() {
cout << "Person's default constructor." << endl;
}
Person006(int a) {
cout << "Person's parameterized constructor." << endl;
}
~Person006() {
cout << "Person's destructor." << endl;
}
};
void test0006() {
Person006 p1;//栈区开辟
Person006* p2 = new Person006;//堆区开辟
delete p2;
//当void* 接收new出来的指针, 会出现释放的问题
void* p = new Person006;
//无法释放 p, 所以避免这种写法
delete p;
//通过new开辟数组, 一定会调用默认构造函数,故一定要提供默认构造函数
Person006* pArray = new Person006[10];
//在栈上开辟数组, 可以指定有参构造
Person006 pArray2[2] = { Person006(1),Person006(2) };
//释放数组
delete[] pArray;
}