动态对象创建
产生条件
当创建数组的时候,总是需要提前预定数组的长度,然后编译器分配预定长度的数组空间,在使用数组的时,会有这样的问题,数组也许空间太大了,浪费空间,也许空间不足,所以对于数组来讲,如果能根据需要来分配空间大小再好不过。所以动态的意思意味着不确定性。
C动态分配内存
为了解决这个普遍的编程问题,在运行中可以创建和销毁对象是最基本的要求。c早就提供了动态内存分配(,函数malloc和free可以在运行时从堆中分配单元。
代码示例
int *p = (int*) malloc( sizeof(int) * 10 ); //分配10个int型的内存空间
free(p); //释放内存
缺陷:
1、程序员必须确定对象的长度。
2、malloc返回一个void指针,c++不允许将void赋值给其他任何指针,必须强转。
3、 malloc可能申请内存失败,所以必须判断返回值来确保内存分配成功。
4、在使用对象之前必须记住对它初始化,构造函数不能显示调用初始化(构造函数是由编译器调用),用户有可能忘记调用初始化函数。
C++动态分配内存
C++中通过new关键字进行动态内存申请,当用new创建一个对象时,它就在堆里为对象分配内存并调用构造函数完成初始化。
C++中的动态内存申请是基于类型进行的
C++中delete关键字用于内存释放。delete表达式先调用析构函数,然后释放内存。正如new表达式返回一个指向对象的指针一样,delete需要一个对象的地址。delete只适用于由new创建的对象。
变量申请基本语法
Type* pointer = new Type; // 内存申请
delete pointer; // 内存释放
代码示例
#include <iostream>
#include <cstring>
using namespace std;
// 创建Person类
class Person{
public:
// 定义成员变量
char* pName;
int mAge;
// 无参构造
Person(){
cout << "无参构造函数!" << endl;
pName = (char*)malloc(strlen("undefined") + 1);
strcpy(pName, "undefined");
mAge = 0;
}
// 代参构造
Person(char* name, int age){
cout << "有参构造函数!" << endl;
pName = (char*)malloc(strlen(name) + 1);
strcpy(pName, name);
mAge = age;
}
void ShowPerson(){
cout << "Name:" << pName << " Age:" << mAge << endl;
}
~Person(){
cout << "析构函数!" << endl;
if (pName != NULL){
delete pName;
pName = NULL;
}
}
};
// 调用函数
void test(){
// 创建对象
Person* person1 = new Person;
Person* person2 = new Person("John",33);
// 对象调用方法
person1->ShowPerson();
person2->ShowPerson();
// 释放内存
delete person1;
delete person2;
}
int main()
{ // 调用函数
test();
return 0;
}
代码运行结果
数组申请基本语法
当创建一个对象数组的时候,必须对数组中的每一个对象调用构造函数,除了在栈上可以聚合初始化,必须提供一个默认的构造函数。
Type* pointer = new Type[N]; // 数组申请
delete[] pointer; // 内存释放
代码示例
#include <iostream>
/**
* 利用new在堆区开辟数组
*/
using namespace std;
class Person
{
public:
Person()
{
cout << "Person的默认构造函数调用" << endl;
}
Person(int a )
{
cout << "Person的有参构造函数调用" << endl;
}
Person(const Person & p)
{
cout << "Person的拷贝构造函数调用" << endl;
}
~Person()
{
cout << "Person的析构函数调用" << endl;
}
};
int main() {
// 创建数组对象
int * intArray = new int[10];
char * charArray = new char[100];
//如果利用new在堆区开辟 自定义类型数据的数组,必须有默认构造函数
Person * personArray = new Person[3];
delete [] personArray;
//如果在栈上开辟数组,可以没有默认构造函数
//Person pArray[2] = { Person(1), Person(2) };
//delete personArray;
return 0;
}
程序运行结果
new和malloc区别
new关键字
new关键字是C++的一部分。
new以具体类型为单位进行内存分配。
new在申请单个类型变量时可进行初始化
malloc函数
mallloc是由C库提供的函数。
malloc 以字节为单位进行内存分配。
malloc不具备内存初始化的特性。