使用关键字new动态分配内存,在new后面为其分配内存对象的类型,让编译器知道需要多少内存。new的返回值是一个内存地址,内存的地址被存储在指针中,因此将new的返回值赋给一个指针。如
short int* p; p = new short int;
或者声明指针的同时直接初始化,
short int* p= new short int;
无论用哪种方式,p都指向了short int,然后就可以向变量的指针那样使用如
*p = 72; //将72放在动态内存中
使用完了指针记得一定要释放指针。可以用delete释放内存。
如果用new分配内存,系统不会自动释放内存,所以我们必须要用delete是否内存。如果没有释放掉,那么这块内存就变得不可用。这叫内存泄漏。释放内存如:
delete p;
删除指针,也就释放了指针中的内存,相等于把指针指向的内存区域释放掉。该指针仍然存在。可以重新给它赋值。示例:在堆中给变量分配内存。使用后并删除它。
int*p = new int; delete p; //删除指针 p = 0; //将指针设为0 delete p; //程序崩溃
使用new分配内存,使用和删除指针示例
int i = 5; int* p = &i; int* p1 = new int; *p1 = 6; cout<<"i="<<i<<endl; cout<<"*p="<<*p<<endl; cout<<"*p1="<<*p1<<endl; delete p1; p1 = new int; *p1 = 7; cout<<"*p1="<<*p1<<endl; delete p1; getchar(); return 0;
输出结果为:
i = 5
*p = 6
*p1 = 6
*p1 = 7
我们可以在堆中创建对象,就像创建指针一样,它可以指向任何类型,包括类对象。如
定义一个person类,可以声明一个指向person类的指针,并在堆中实例化一个person对象
如 Person* P = new Person;
当调用默认的构造函数,系统自动创建默认的构造函数,无论是在堆中还是在栈中创建都将调用默认的构造函数。然而,需要注意的是,使用new创建对象是,不仅可以使用默认的构造函数,也可以使用任何构造函数。
用delecte删除对象的指针时,释放内存之前调用对象的析构函数。这也就意味着让类指向了清理的工作。通常是从堆中分配而来的。就像从堆中删除对象一样。
示例 从堆中创建和删除对象
class Person { public: Person(); ~Person(); private: int age; }; Person::Person() { cout<<"构造函数调用"<<endl; age = 1; } Person::~Person() { cout<<"析构函数调用"<<endl; } int main() { cout<<"创建一个对象p"<<endl; Person ps; cout<<"new一个对象p1"<<endl; Person* p1 = new Person; cout<<"删除p1"<<endl; delete p1; getchar(); return 0; } 输出结果
创建一个对象p
构造函数调用
new一个对象p1
构造函数调用
删除p1
构造函数调用
从上结论可以得出,无论是从堆中还是在栈中,系统都默认调用构造函数被调用。在堆中创建对象的时候,系统自动调用默认的构造函数。在删除指针p1时,导致析构函数自动被调用,同时分配p1的对象内存被释放。