1、什么是 trivial destructor和 non-trivial destructor
如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。
在C++的类中如果只有基本的数据类型,也就不需要写显式的析构函数,即用默认析构函数就够用了,但是如果类中有个指向其他类的指针,并且在构造时候分配了新的空间,则在析构函数中必须显式释放这块空间,否则会产生内存泄露,在STL中空间配置时候destory()函数会判断要释放的迭代器的指向的对象有没有 trivial destructor(STL中有一个 has_trivial_destructor函数,很容易实现检测),如果有trivial destructor则什么都不做,如果没有即需要执行一些操作,则执行真正的destory函数。
trivial意思是无意义,这个trivial和non-trivial是对类的四种函数来说的:
- 构造函数(ctor)
- 复制构造函数(copy)
- 赋值函数(assignment)
- 析构函数(dtor)
如果至少满足下面3条里的一条:
- 显式(explict)定义了这四种函数。
- 类里有非静态非POD的数据成员。
- 有基类。
那么上面的四种函数是non-trivial函数,比如叫non-trivial ctor、non-trivial copy…,也就是说有意义的函数,里面有一下必要的操作,比如类成员的初始化,释放内存等。
2、什么是POD类型
POD类类型是指聚合类(aggregate classes, 即POD-struct types)与聚合union (POD-union types),且不具有下述成员:
-
指针到成员类型的非静态数据成员(包括数组)。
-
非POD类类型的非静态数据成员(包括数组)。
-
引用类型的(reference type)非静态数据成员。
-
用户定义的拷贝与赋值算子。
-
用户定义的析构函数。
术语聚合是指任何的数组或者类,且不具有下述特征:
-
用户定义的构造函数。
-
私有或保护的非静态数据成员。
-
基类。
-
虚函数。
可见,POD类类型就是指class、struct、union,且不具有用户定义的构造函数、析构函数、拷贝算子、赋值算子;不具有继承关系,因此没有基类;不具有虚函数,所以就没有虚表;非静态数据成员没有私有或保护属性的、没有引用类型的、没有非POD类类型的(即嵌套类都必须是POD)、没有指针到成员类型的(因为这个类型内含了this指针)。