我有一个查询内部状态对象的类:
class State {...}; //Has a copy and move constructor
class Processor
{
private:
std::unique_ptr<State> state;
public:
void process(...)
{
State newState;
... //create this new state
state.reset(new State(newState));
}
State getState()
{
return std::move(*state.release());
}
};这是对std::move的恰当使用吗?我可以保证每次对process的调用只会调用一次getState,但是由于这个特定系统的设计,我不能仅仅从process返回newState。关于Stack Overflow和其他地方的许多其他答案都说,只返回对象更好,因为编译器会移动它或RVO它,但这些都是在返回的对象是函数的本地对象的情况下。
我不一定需要状态对象在unique_ptr之后,但这似乎是管理新状态对象的最简单方法。我的实际实现在最后有一个指针被直接传输到unique_ptr。
发布于 2013-01-31 06:36:58
原来的演示代码有错误-- unique_ptr永远不会释放指针。答案涉及到移动到局部函数空间,然后正常返回。
class State {...}; //Has a copy and move constructor
class Processor
{
private:
std::unique_ptr<State> state;
public:
void process(...)
{
State* newState;
... //newState is allocated on the heap somehow
state.reset(newState);
}
State getState()
{
State _state(std::move(*state));
//Optionally: state.reset();
return _state;
}
};发布于 2013-01-31 06:30:04
只返回状态有什么问题
struct state {};
class processor {
public:
void process() {
state_ = State();
}
state get_state() {
return std::move(state_);
}
private:
state state_;
};这将在构造处理器时默认构造state_,但您可以使用optional包装器防止这种情况发生。您仍然必须保证只在process之后调用get_state,这是非常糟糕的。
发布于 2013-01-31 07:15:11
您可以只返回类型为std::unique_ptr<State>的state,它将与std::move(state)一起完美地移动。在这种情况下,当通过值返回时,您无需复制整个state对象。如果调用者没有捕获state对象,它将被自动销毁。对于复杂的堆分配对象来说,这是一种非常有效的方法。但是要小心,通过移动state可以清除Processor对象的状态。因此,在这种情况下,getState不是最好的名称,它应该像fetchState或popState一样。
https://stackoverflow.com/questions/14614903
复制相似问题