zoukankan      html  css  js  c++  java
  • 用于数组的delete p324

    delete 对象地址;

    delete 首先调用待清除对象的析构函数,然后释放内存

    如果delete一个void指针,唯一发生的事情就是释放了内存。因为通过void指针,无法知道对象的类型,就无法调用其析构函数。

    delete []books;

    []告诉编译器,books实际上是一个对象数组的起始地址。该代码的任务是,把数组创建时存放在某处的数组元素个数取回,并为数组的所有对象调用析构函数。

    1 测试程序deleteTest.cpp

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 class Book
     7 {
     8     string name;
     9     string author;
    10     double price;
    11 
    12 public:
    13     Book() : name("null"), author("null"), price(0) 
    14     {
    15         cout << "invoke constructor Book() " << endl;
    16     }
    17     Book(string name, string author, double price) : name(name), author(author), price(price) 
    18     {
    19         cout << "invoke constructor Book(string " << name << ", string " << author << ", double "<< price << ") " << endl;
    20     }
    21 
    22     //复制构造函数
    23     Book(const Book& b) : name(b.name), author(b.author), price(b.price) 
    24     {
    25         cout << "Book::Book(const Book& b)" << endl;
    26     }
    27 
    28     ~Book()
    29     {
    30         cout << "~Book()" << endl;
    31         cout << "free book: '" << name << "'" << endl;
    32     }
    33 
    34     friend ostream& operator<<(ostream& os, const Book& b)
    35     {
    36         return os << "BookName: " << b.name << ", BookAuthor: " << b.author 
    37             << ", BookPrice: " << b.price;
    38     }
    39 
    40     //重载赋值运算符
    41     Book& operator=(const Book& b)
    42     {
    43         cout << "Book::operator=(const Book&)" << endl;
    44         name = b.name;
    45         author = b.author;
    46         price = b.price;
    47 
    48         return *this;
    49     }
    50 };
    51 
    52 
    53 
    54 int main()
    55 {
    56     //数组book里放的是Book类型的指针 -- 使用new在堆上创建对象数组
    57     //在堆上为‘5个Book对象’分配了内存,并为这5个Book对象调用了构造函数
    58     Book* books = new Book[5];
    59     
    60     Book* b1 = new Book("算法精解", "Kyle Loudon", 56.2);
    61     Book* b2 = new Book("Qt程序设计", "Pulat", 10.2);
    62 
    63     books[0] = *b1; //
    64     books[1] = *b2;
    65     
    66     cout << "---- delete b1 ----" << endl;
    67     delete b1;
    68     cout << "---- delete b2 ----" << endl;
    69     delete b2;
    70     
    71     cout << "---- delete []books ----" << endl;
    72     delete []books;
    73 
    74     return 0;
    75 };

    运行结果:

    2 对象数组

     Book* books = new Book[5];

    使用new在堆上创建了一个包含5个Book对象的数组,books是该数组的起始地址(首地址、第一个元素的地址)

    books是一个指向Book对象的指针变量,与Book* bk1 = new Book;创建一个Book对象的语法形式是一样的;但Book* books = new Book[5];编译器会记住books指向的Book对象后面还跟4个Book对象。

  • 相关阅读:
    NLP(二十九)一步一步,理解Self-Attention
    树莓派4B踩坑指南
    树莓派4B踩坑指南
    树莓派4B踩坑指南
    【2020.4.17】发现GitHub图片又裂了
    右键管理-干掉多余又删不掉的access
    Python format参数中的列表和元组可以使用“*”
    树莓派4B踩坑指南
    树莓派4B踩坑指南
    树莓派4B踩坑指南
  • 原文地址:https://www.cnblogs.com/asnjudy/p/4604346.html
Copyright © 2011-2022 走看看