为什么在函数内部初始化时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 不同。

以上是为什么在函数内部初始化时C++对象会被破坏?我能做些什么来防止它?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>