【发布时间】:2014-04-28 18:45:48
【问题描述】:
这是一个简单的测试:
#include <iostream>
#include <vector>
using namespace std;
class C
{
public:
int _a;
C(int a) { cout << "constructor C: " << (_a = a) << endl; }
~C() { cout << "destructor C: "<< _a << endl; }
};
int main()
{
vector<C> vec;
for(int i=0; i<2; i++)
vec.push_back(i+1);
cout << "Go out --->\n";
return 0;
}
输出:
constructor C: 1
destructor C: 1
constructor C: 2
destructor C: 1
destructor C: 2
Go out --->
destructor C: 1
destructor C: 2
当 C 是一个具有负责任的析构函数的真实类时,这看起来并不好笑。 有什么建议? 提前谢谢你。
【问题讨论】:
-
与此处相同的问题 -> stackoverflow.com/q/2745350/476681
-
你真的应该为像这样的非平凡类定义(或禁止!)一整套构造函数和赋值运算符;-)。然后您会看到(并正确实施)或禁止分配和复制您的对象,例如进出容器。 BЈовић 的链接说明了这些问题。
-
有趣的是,我们对 1 有 3 个破坏,但对于 2“只有”两个。原因是向量通过重新分配而增长,从而复制了之前的元素(这里是 1)并破坏了旧的元素。如前所述,不记录复制,但记录破坏。啊,我明白了,弗拉德也做了同样的观察 :-)
标签: c++ vector destructor