• C++_类和动态内存分配5-使用指向对象的指针


    再探new和delete

    new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的;

    析构函数使用delete来释放这些内存。

    字符串是一个字符数组,所以析构函数使用的是带中括号的delete。

     

    使用new来为整个对象分配内存:

    String * favorite = new String(saying[choice]);

     

    这不是为要存储的字符串分配内存,而是为对象分配内存;也就是说,为保存字符串地址的str指针和len成员分配内存。

    指针和对象小结

    使用常规表示法来声明指向对象的指针:

    String * glamour;

     

    可以将指针初始化为指向已有的对象;

    String * first = &saying[0];

     

    可以使用new来初始化指针,这将创建一个新的对象

    String * favorite = new String(sayings[choice]);

     

    对类使用new将调用相应的类构造函数来初始化新创建的对象:

    //调用默认构造函数

    String * gleep = new String;

     

    //调用 String(const char *) 构造函数

    String * glop = new String(“my my my”);

     

    //调用 String(const String &)构造函数

    String * favorite = new String(saying[choice]);

     

    可以使用->运算符通过指针访问类方法:

    if (saying[i].length()< shortest ->length())

     

    可以对对象指针应用解除引用运算符(*)来获得对象

    if (saying[i]<*first)

           first = &saying[i];

     

    12.5.3 再谈定位new运算符

    定位new运算符能够让您能够在分配内存时能够指定内存位置。

     

    char * buffer = new char[BUF];

    JustTesting *pc1;

    pc1 = new (buffer) JustTesting;  //定位new运算符

    pc2 = new JustTesting(“Heap”,20);

    pc3 = new (buffer +sizeof(JustTesting))JustTesting(“Better Idea”, 6);

    使用定位new运算符来为对象分配内存,必须确保其析构函数被调用。如何确保呢?、对于在堆中创建的对象,可以这样做。

    delete pc2;

     

    但是对于pc1却不可以,原因在于delete可以与常规new运算符配合使用,却不能与定位new运算符配合使用。

    Pc3没有收到new运算符返回的地址。因此delete pc3将导致运行阶段错误。

    Delete pc1将释放buffer,而不是pc1;

    系统没有为定位new运算符在该内存块中创建的对象调用析构函数。

    对于这种情况,需要显式地为定位new运算符创建的对象调用析构函数。这是少数几个需要显式调用析构函数的情形。

     

    pc3 ->~JustTesting();

    pc1 ->~JustTesting();  //销毁对象的顺序,先销毁后创建的对象。类似于栈的先进后出顺序。

    仅当所有对象都被销毁后,才能释放用于存储这些对象的缓冲区。

  • 相关阅读:
    java内存模型
    如何保证消费者接收消息的顺序
    mysql事务隔离级别
    mysql加锁读
    mysql一致性读
    InnoDB锁
    JDK1.8中的线程池
    JDK1.8中HashMap实现
    物品推荐(基于物品的协同过滤算法)
    CRM 2013 生成自动编号
  • 原文地址:https://www.cnblogs.com/grooovvve/p/10493521.html
Copyright © 2020-2023  润新知