为什么在函数内部初始化时C++对象会被破坏?我能做些什么来防止它?
在这里,当我推入堆栈时,为什么对象会被销毁?
#include <iostream>
#include <stack>
class One
{
private:
int i;
public:
One(int i) {this->i = i;}
~One() {std::cout << "value " << this->i << " is destroyedn";}
};
int main()
{
std::stack<One> stack;
stack.push(One(1));
stack.push(One(2));
std::cout << "Now I'll stopn";
}
我之前预计不会看到任何输出Now I'll stop。但我明白了
value 1 is destroyed
value 2 is destroyed
Now I'll stop
value 1 is destroyed
value 2 is destroyed
如果我想防止它们被破坏,我该怎么办?
回答
One(1)并One(2)构造两个临时对象,将它们传递给push然后复制(移动)到stack. 临时表在完整表达式后立即销毁。
如果您想避免构建临时文件,您可以emplace改用。
将新元素压入堆栈顶部。该元素是就地构造的,即不执行复制或移动操作。
例如
stack.emplace(1);
stack.emplace(2);
- @Wolf [返回值](https://en.cppreference.com/w/cpp/container/stack/emplace#Return_value) 与 C++17 不同。