如何理解该物体已被破坏?

时间:2018-12-01 17:36:58

标签: c++

我有一些代码:

void some_function(object *o)
{
    some_other_function(o);
    /* some actions with o */
}

万事大吉,但在某些情况下some_other_function可能会破坏o。如何在some_function中进行检查以避免分段错误?

我认为该对象已设置为NULL,但是从调试器中对其进行了检查,但我意识到并非如此。

3 个答案:

答案 0 :(得分:1)

唯一的方法是读取some_other_function的源代码(或文档,如果没有的话)。甚至在某些情况下可能还不够。无法仅通过查看指针来知道该指针是否指向有效对象。

这是您应该对所有拥有的指针使用智能指针的另一个原因。如果some_functionsome_other_function都接受了它们的参数为std::unique_ptr<object>,那么您将(假设您的函数行为良好)知道指向的对象已被some_other_function破坏。同样,如果他们接受std::shared_ptr<object>作为其参数,您将知道在调用some_other_function之后该对象仍然存在。拥有明确的所有权语义是编写安全代码的关键之一,而智能指针对于定义这些所有权语义有很大帮助。

答案 1 :(得分:1)

实际上,无法判断内存是否已释放并且相关对象是否已销毁。您只会得到无效的指针。

为此,我可以向您推荐一些解决方法,但是在此之前,我认为您应该阅读有关C ++工作原理的更多信息。

object *o(传递给该函数的对象只是该对象指针的副本),因此,删除对象时,指针将变为无效,在该函数之外,对该指针的修改将不可见。 / p>

void some_other_function(object *o) {
      delete o;
      o = nullptr; // Copy of the pointer to the o was set to nullptr.
}

void some_function(object *o)
{
    some_other_function(o);
    if(o == nullptr) {
       //Code inside here will not be ever executed.
    }
    /* some actions with o */
}

但是,如果您传递指针引用

void some_other_function(object &*o) {
      delete o;
      o = nullptr; // o is the reference to pointer, so outside of the function modification will be visible.
}

函数calee将看到o变成了nullptr

这是一种模式,另一种模式将使用智能指针std::unique_ptrstd::shared_ptr或使用返回值指示删除。

if(!some_other_function(o)) {
// Object was deleted
}

答案 2 :(得分:0)

在2018年,我明智地使用智能指针。 如果您不能使用智能指针,请设计代码,以便明确定义对象所有权。您不应该具有可能删除对象的功能,这不是一个好习惯,并且会咬您。 为了完整起见,但我也不建议您以任何方式这样做,您可以只让函数返回一个布尔值,以指示对象是否已被破坏。