在c ++中强制执行NULL检查

时间:2014-04-22 10:25:16

标签: c++ pointers boost

我的方法可以返回某种指针(例如boost :: shared_ptr),这个指针可能是NULL。有没有办法强制我的代码用户检查,如果它是空的?

这类事情的一些例子 - scals的Option容器,可能是boost有类似boost :: option吗?

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  • 返回一个智能指针类型,如果访问并设置为NULL,则抛出异常。
  • 抛出异常而不是返回NULL指针
  • 返回一个表达意图的std :: optional(或boost :: optional)(即"值可能丢失")比指针好多了

答案 1 :(得分:2)

通常的解决方案是将返回值包装在一个类中 包含一个标志,如果指针被选中则设置该标志 复制,如果没有设置标志,其析构函数会崩溃。 类似的东西:

template <typename T>
class MustBeChecked
{
    T* myValue;
    mutable bool myHasBeenChecked;
public:
    MustBeChecked( T* value )
        : myValue( value )
        , myHasBeenChecked( false )
    {
    }
    MustBeChecked( MustBeChecked const& other )
        : myValue( other.myValue )
        , myHasBeenChecked( false )
    {
        other.myHasBeenChecked = true;
    }
    ~MustBeChecked()
    {
        assert( myHasBeenChecked );
    }

    bool operator==( nullptr_t ) const
    {
        myHasBeenChecked = true;
        return myValue == nullptr;
    }

    bool operator!=( nullptr_t ) const
    {
        myHasBeenChecked = true;
        return myValue != nullptr;
    }

    operator T*() const
    {
        assert( myHasBeenChecked );
        return myValue;
    }
};
坦率地说,我发现在大多数情况下这都是矫枉过正的。但我已经 看到它用在一些关键系统上。

答案 2 :(得分:1)

这里的现实是你的功能的来电者已经必须检查。如果他们试图在不进行检查的情况下访问共享指针,那么如果底层指针为NULL,则会出现seg-fault。

您没有指定是否正在编写库或项目中的某些代码。你也没有详细说明这个代码所处的背景 - 所有这些都可能决定我在这种情况下采取的方法 - 但从广义上讲,所有utnapistim的建议都是好的。