【发布时间】:2015-07-27 07:17:55
【问题描述】:
我最近在写一个分层状态机。我想在过渡到另一个超状态时设置一个初始子状态。
因此我有如下代码来设置初始状态。第一个版本
void Foo::setInitialSubState(State* next_state){
if(state_)
delete state_;
state_ = next_state;
state_->enter(*this);
}
然后我发现 if(state_) 总是返回 true.. 所以我删除了它。该函数在构造函数 Foo::Foo() 中调用。
Foo::Foo()
{
setInitialSubState(new State());
}
我想删除 state_ 时出现段错误错误。所以我在构造函数中初始化了成员 var state_。
Foo::Foo()
{
state_ = 0;
setInitialSubState(new State());
}
这将解决段故障问题。
我想知道我使用setInitialSubState(new State())时是否有内存泄漏问题?我不知道..如何更改 if(state_) 以避免 delete() 导致段错误?
感谢您的所有善意建议..
----编辑----
为了让自己更清楚地了解内存泄漏部分,我想我可以将问题改写为
void Foo::setInitialSubState(State* next_state)
{
state_ = next_state;
delete state_;
}
Foo::Foo()
{
state_ = 0;
setInitialSubState(new State());
}
有没有内存泄漏?
【问题讨论】:
-
你可以在指向0的指针上调用delete。如果你在随机地址上调用它,可能会导致段错误。始终初始化您的指针。
-
仍然回答最初的问题,是的,调用
new Foo()在某些情况下会导致内存泄漏(主要是在异常情况下)。 -
只删除 if(state_) 部分,保留 delete state_ 部分。
-
@Jaciq 这可能会导致未定义的行为。
-
你为什么不看看std::unique_ptr?
标签: c++ memory-leaks