考虑这段代码:
#include <vector>
#include <iostream>
using namespace std;
class Base
{
char _type;
public:
Base(char type):
_type(type)
{}
~Base() {
cout << "Base destructor: " << _type << endl;
}
};
class uncopyable
{
protected:
uncopyable() {}
~uncopyable() {}
private:
uncopyable( const uncopyable& );
const uncopyable& operator=( const uncopyable& );
};
class Child : public Base, private uncopyable
{
int j;
public:
Child():
Base('c')
{}
~Child() {
cout << "Child destructor" << endl;
}
};
int main()
{
vector<Base> v;
Base b('b');
Child c;
v.push_back(b);
v.push_back(c);
return 0;
}
我的系统上的输出是:
Base destructor: b
Child destructor
Base destructor: c
Base destructor: b
Base destructor: b
Base destructor: c
我的问题是:
为什么
Base
(类型 b)的析构函数被调用了 3 次而不是 2 次(我们是否有超过两个对象 b 的副本)?Child
考虑到其父对象之一的复制构造函数是私有的,当我们复制类型对象时会发生什么。它是未定义的行为吗?每当我尝试复制类型的对象时,我都希望得到一个编译时错误
Child
。我以为孩子的默认复制构造函数会尝试调用 Uncopyable 类的私有复制构造函数并导致编译错误。为什么它不给出编译错误?
以这种方式设计代码的原因是因为Child
类很大。
Child
所需的行为是每当客户端尝试复制对象时丢弃子数据(调用析构函数Child
而不调用析构函数Base
)。
这段代码实现了这一点,但我猜它会导致未定义的行为并存在内存泄漏(从不Child
为复制的实例调用析构函数)。