用于数组的delete p324
2015-06-27 17:35
274 查看
delete 对象地址;
delete 首先调用待清除对象的析构函数,然后释放内存
如果delete一个void指针,唯一发生的事情就是释放了内存。因为通过void指针,无法知道对象的类型,就无法调用其析构函数。
delete []books;
[]告诉编译器,books实际上是一个对象数组的起始地址。该代码的任务是,把数组创建时存放在某处的数组元素个数取回,并为数组的所有对象调用析构函数。
1 测试程序deleteTest.cpp
运行结果:
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对象。
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对象。
相关文章推荐
- 笔记114--记录登陆界面的实现
- hdu 1873 看病要排队
- CSS/JQuery元素选择器之&&和||,选择器的逻辑操作
- 字符串基本处理算法
- DIV横向排列_CSS如何让多个div盒子并排同行显示
- (转)内联(inline)函数与虚函数(virtual)的讨论
- Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
- awk调用系统命令
- 各种排序算法的分析及java实现
- python的logging模块详解
- POJ3253
- MacBook 连接Centos服务器
- AngulatJS多个控制器内数据共享
- java 16进制负数
- 论开辟经济发展的第二战场
- php的入门第一个例子(包括linux的环境安装与包括页面跳转,以及curl命令的调用)
- 正确的解决GridLayout在安卓4.0以下版本中兼容问题
- 2015.6.24 XJOI T1.不可视境界线
- LeetCode Multiply Strings
- Log4j —— 初步了解和使用