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()
{
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[]; Book* b1 = new Book("算法精解", "Kyle Loudon", 56.2);
Book* b2 = new Book("Qt程序设计", "Pulat", 10.2); books[] = *b1; //
books[] = *b2; cout << "---- delete b1 ----" << endl;
delete b1;
cout << "---- delete b2 ----" << endl;
delete b2; cout << "---- delete []books ----" << endl;
delete []books; return ;
};

运行结果:

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 p324的更多相关文章

  1. 为什么new的普通数组用delete 和 delete[]都能正确释放

    由同事推荐的一篇博客: 为何new出的对象数组必须要用delete[]删除,而普通数组delete和delete[]都一样-------_CrtMemBlockHeader 文章解释了delete 内 ...

  2. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  3. C++ Union妙用(将列表初始化用于数组元素)

    Union是个不被注意的关键字,意为联合体,这是个诡异的名字.若不是为了继承C语言,它也不会出现在C++中(虽说,union在C++中得到了扩充,完成了接近类的功能).它的作用主要是节省内存空间,在嵌 ...

  4. Numpy用于数组的文件输入输出

    这一章比较简单,内容也比较少.而且对于文件的读写,还是使用pandas比较好.numpy主要是读写文本数据和二进制数据的. 将数组以二进制的格式保存到硬盘上 主要的函数有numpy.save和nump ...

  5. Numpy用于数组数据的存储和读取

    Python的Numpy模块可用于存储和读取数据: 1.将一个数组存储为二进制文件 Numpy.save:将一个数组以.npy的格式保存为二进制文件 调用格式:numpy.save(file, arr ...

  6. new一个数组,delete释放内存

    int *a = new int[4]; for(int i=0;i<4;i++) { a[i] = i; printf("a[%d]=%d\n", i, i); } del ...

  7. 为什么for in循环不适合用于数组

    首先一点无关的,使用(var i in a) 而不是( i in a),除非你想创建全局变量. 第二点,for in 循环会忽略空的数组 var a = []; a[5] = 5; // Perfec ...

  8. Numpy 用于数组的文件输入和输出

    将数组以二进制格式保存 np.save 和np.load 是读写磁盘数组数据的两个主要函数.默认情况下,数组是以未压缩的原始二进制格式进行保持在扩展名 为.npy的文件中的 如果文件路径末尾没有扩展名 ...

  9. JavaScript Array Reduce用于数组求和

    需求一 假设有一个数组,需要对其中的元素进行求和. const numbers = [1, -1, 2, 3]; 传统写法,使用for循环求和 const numbers = [1, -1, 2, 3 ...

随机推荐

  1. update批量更新某一列成其它列对应的值【原】

    update批量更新某一列成其它列对应的值 postgresql 标准sql语句 update AA set name = BB.name , AA.sex = BB.sex from BB wher ...

  2. 强力Django+杀手级xadmin开发在线教育网站

    强力Django+杀手级xadmin开发在线教育网站采用 Python3.7全新开发 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的 ...

  3. Vue.之.安装

    Vue.之.安装 第一步npm安装 首先:先从nodejs.org中下载nodejs   直到Finish完成安装. 打开控制命令行程序(CMD),检查是否正常 使用淘宝NPM 镜像 国内直接使用np ...

  4. 使用C3P0和DBUtils

    1.导包 2.配置c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?> <c3p0-c ...

  5. DOM修改元素的方法总结

    今天我们要谈谈DOM元素的修改(包括修改内容,属性,样式).修改内容的方法----3种:elem.innerHTML:获取或设置元素开始标签到结束标签之间的原始HTML代码片段:elem.textCo ...

  6. java定时(循环)执行一个方法

    java中设置定时任务用Timer类可以实现. 一.延时执行 首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行.代码如下: package test ...

  7. 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...

  8. More Effective C++: 02操作符

    05:谨慎定义类型转换函数 有两种函数允许编译器进行隐式类型转换:单参数构造函数(single-argument constructors)和隐式类型转换运算符.单参数构造函数是指只用一个参数即可以调 ...

  9. Effective C++: 07模板与泛型编程

    C++ template机制自身是一部完整的图灵机(Turing-complete):它可以被用来计算任何可计算的值.于是导出了模板元编程(TMP, template metaprogramming) ...

  10. node.js(连接mysql)

    mysql语句中的SQL sql语句中的分类: ---DDL:(data define language)定义数据列(create,drop,alter,truncate) ---DML:(data ...