尽管很大程度上倾向于不会自动为指针类型的元素调用 delete, 我还是对这一点心存疑惑.
// test container 对元素 dtor的调用
struct T {
T() { cout << __FUNCSIG__ << endl; }
T(const T& that) { cout << __FUNCSIG__ << endl; }
T& operator= (const T& that) { cout << __FUNCSIG__ << endl; return *this; }
~T() { cout << __FUNCSIG__ << endl; }
};
vector list_p;
T * tp = new T;
list_p.push_back( tp );
list_p.clear();
puts("after list_p.clear() " );
输出是:
========================== Run the Program =================
Hello, world, 15
__thiscall main::T::main::T(void)
after list_p.clear()
析构函数没有被调用.
但如果保存的是对象本身:
vector list;
T tp;
list.push_back( tp );
list.clear();
puts("after list_p.clear() " );
输出变成了:
========================== Run the Program =================
Hello, world, 15
__thiscall main::T::main::T(void)
__thiscall main::T::main::T(const struct main::T &)
__thiscall main::T::~main::T(void)
after list_p.clear()
__thiscall main::T::~main::T(void)
在显式调用list.clear()时, 就会同步触发了对 list内部的那个对象(是tp的一份copy而非tp本身)的析构. 在 after list_p.clear() 之后出现的一次析构, 则是对象 tp 本身超出作用域所引发的.
非常需要注意的一点是: 容器保存的是对象的copy, 而非对象本身. 容器在管理对象时, 会调用其copy ctor函数, 所以放入窗口中的对象最好其copy代价是0.
阅读(534) | 评论(0) | 转发(0) |