您的位置:首页 > 其它

用于数组的delete p324

2015-06-27 17:35 274 查看
delete 对象地址;

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

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

delete []books;

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

1 测试程序deleteTest.cpp

#include <iostream>
#include <string>

using namespace std;

class Book
{
string name;
string author;
double price;

public:
Book() : name("null"), author("null"), price(0)
{
cout << "invoke constructor Book() " << endl;
}
Book(string name, string author, double price) : name(name), author(author), price(price)
{
cout << "invoke constructor Book(string " << name << ", string " << author << ", double "<< price << ") " << endl;
}

//复制构造函数
Book(const Book& b) : name(b.name), author(b.author), price(b.price)
{
cout << "Book::Book(const Book& b)" << endl;
}

~Book()
{
cout << "~Book()" << endl;
cout << "free book: '" << name << "'" << endl;
}

friend ostream& operator<<(ostream& os, const Book& b)
{
return os << "BookName: " << b.name << ", BookAuthor: " << b.author
<< ", BookPrice: " << b.price;
}

//重载赋值运算符
Book& operator=(const Book& b)
{
cout << "Book::operator=(const Book&)" << endl;
name = b.name;
author = b.author;
price = b.price;

return *this;
}
};

int main()
{
//数组book里放的是Book类型的指针 -- 使用new在堆上创建对象数组
//在堆上为‘5个Book对象’分配了内存,并为这5个Book对象调用了构造函数
Book* books = new Book[5];

Book* b1 = new Book("算法精解", "Kyle Loudon", 56.2);
Book* b2 = new Book("Qt程序设计", "Pulat", 10.2);

books[0] = *b1; //
books[1] = *b2;

cout << "---- delete b1 ----" << endl;
delete b1;
cout << "---- delete b2 ----" << endl;
delete b2;

cout << "---- delete []books ----" << endl;
delete []books;

return 0;
};


运行结果:



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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: