堆栈调用析构函数,即使遵循三规则

Stack calling destructor even after following the rule of three

本文关键字:规则 调用 析构函数 堆栈      更新时间:2023-10-16

每次我将一个对象推送到我的堆栈中时,它都会调用它为析构函数。我认为这是因为它正在制作一个临时对象,推动它,然后破坏临时对象。

enum State{Empty, Main, Menu};
class StateInfo{
public: 
StateInfo(State state);
~StateInfo();
StateInfo(const StateInfo& otherState);
StateInfo& operator=(const StateInfo& otherState);
private:
std::string _stateType;
State _state;
};

析构函数只是打印一条消息,指出_stateType已被销毁。copy 和 = 函数只是将 _stateType 和 _state = 设置为另一个状态。

当我制作一个堆栈并推送和反对它时:

std::stack<StateInfo> _stateStack;
   _stateStack.emplace(StateInfo(State::Main));

我收到一条消息,说已调用析构函数。

您应该将语句替换为:

_stateStack.emplace(State::Main);

然后,将就地创建对象,将State::Main传递给它的构造函数。您显式创建了临时StateInfo强制复制或移动 ctor 调用(和析构函数)。

你应该将参数传递给State的构造函数直接传递给emplace()

_stateStack.emplace(State::Main);