• 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的对象内存被释放。

  • 相关阅读:
    SpringCloud_组件常用注解
    SpringBoot_启动器
    SICP习题 1.5 (应用序与正则序)
    SICP习题 1.4 ( if 语句返回运算符)
    SICP习题 1.3 (求较大两个数的递归)
    SICP习题 1.2 (前缀表达式)
    SICP习题 1.1 (if cond语句)
    MySQL5.7 踩坑实录
    类找不到总结java.lang.ClassNotFoundException
    网易校招2018----题目3----字符串碎片
  • 原文地址:https://www.cnblogs.com/delphi2014/p/4021165.html
Copyright © 2020-2023  润新知