C++ 之 指针详解篇(二)

  使用关键字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的对象内存被释放。

 

posted @ 2014-10-12 22:00  Delphi爱好者2014  阅读(262)  评论(0编辑  收藏  举报