堆栈调用析构函数甚至遵循三个规则

时间:2016-06-03 17:56:02

标签: c++

每当我将一个对象推入我的堆栈时,它就会调用它的析构函数。我假设这是因为它正在制作一个tempobject,推动它,然后销毁tempObject。

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 =设置为otherState。

当我制作一个堆栈并将其推入并对象时:

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

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

2 个答案:

答案 0 :(得分:7)

您应该将您的陈述替换为:

_stateStack.emplace(State::Main);

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

答案 1 :(得分:4)

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

_stateStack.emplace(State::Main);