下面是代码,让我感到困惑:
class Simple{
private:
int m_nID;
public:
Simple(int nID) {
m_nID = nID;
}
~Simple() {
std::cout << "Destructing Simple " << m_nID << std::endl;
}
Simple(const Simple& other) {
m_nID = other.m_nID;
};
};
int main(){
Simple Simple1(1); // allocating on stack
Simple Simple2(2); //
Simple Simple3(3); //
std::vector<Simple> m;
m.push_back(Simple1); //
m.push_back(Simple2); // copy constructor called
m.push_back(Simple3); //
std::cout << "\n------ ERASING ELEMENTs FROM VECTOR-------" << std::endl;
m.erase(m.begin()); //
m.erase(m.begin()); // destructor called
m.erase(m.begin()); //
std::cout << "\n------ After ERASING ELEMENT FROM VECTOR-------" << std::endl;
return 0;
}
为什么这三行:
m.erase(m.begin());
m.erase(m.begin());
m.erase(m.begin());
导致此输出:
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
为什么m_nID总是3?对于每个push_back复制构造函数,将1,2,3复制到m_nID,因此不应该是:
Destructing Simple 1 // or 3
Destructing Simple 2 // or 2
Destructing Simple 3 // or 1
?
答案 0 :(得分:7)
std::vector
如何删除第一个元素?它复制了所有
向下的元素(使用赋值),然后析构
最后。尝试检测复制构造函数和赋值
同样,你会看到发生了什么。 (你也可以看到
执行push_back
时的一些意外副本,如果是向量
必须增加其容量。)
答案 1 :(得分:4)
擦除第一个元素时,只会销毁一个元素(最后一个元素)。其他元素从前到后分配:
Initial state: 1, 2, 3
State after copy: 2, 3, 3
State after erase: 2, 3
State after copy: 3, 3
State after erase: 3
Final state: [empty]
3永远是最后一个。
答案 2 :(得分:1)
将您的复制构造器设为
Simple(const Simple& other) {
std::cout << "Copy from "<< other.m_nID << std::endl;
m_nID = other.m_nID;
};
并且您将看到在将事物推入向量释放和重新完成时如何发生,从而导致复制和破坏。
同样,也要定义assignemnt运算符:
Simple& operator=(const Simple& other)
{
std::cout << "assign from " << other.m_nID << " to " << m_nID << std::endl;
m_nID = other.m_nID;
return *this;
}
答案 3 :(得分:0)
当我运行它时,我得到(在将不存在的m.mVector的引用修复为m之后)
Destructing Simple 1
Destructing Simple 1
Destructing Simple 2
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 2
Destructing Simple 1
在我看来,这似乎是在证明推进矢量分流很多东西
编辑 - 在复制构造函数中添加了跟踪
Constructing Simple 1
Constructing Simple 2
Constructing Simple 1
Destructing Simple 1
Constructing Simple 3
Constructing Simple 1
Constructing Simple 2
Destructing Simple 1
Destructing Simple 2
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 3
Destructing Simple 2
Destructing Simple 1
有趣的是,他们不平衡。我现在对此感到惊讶 - 尤其是在Mike Seymour指出最后3行是原始堆栈版本被销毁之后