C++自动检测shared_ptr与NULL的比较位置

3

我们有一个庞大的遗留代码库,其中常用的指针类型更适合使用shared_ptrs。由于各种原因,这些指针类型现在需要进行共享。

与普通指针相比,shared_ptrs是不错的替代品,但是缺少了NULL检查。在代码中,我们经常对这些指针进行NULL检查,在转换为shared_ptrs后,这些空检查将始终通过。

是否有一种简便的方法来自动检测这些情况: if (foo == NULL) // 当 foo 是 boost::shared_ptr 时 ?

我们还没有使用C++11,但很快就会。

例如:

// declared elsewhere as :   boost::shared_ptr<T> foo;
if (NULL != foo) //always true when shared_ptr.  Correct check when raw pointer
{
      foo->DoSomething();
}

7
“将其转换为shared_ptr后,这些空指针检查将始终通过”-- 你是怎么想到的? - Benjamin Lindley
你们系统中的NULL是如何定义类型的?找到定义并将其更改为更安全的内容。 - Dale Wilson
你能展示一个始终通过的检查的例子吗? - n. m.
1
像这样。 - n. m.
我已经在上面添加了一个示例片段。 - Ken Moynihan
显示剩余2条评论
3个回答

2

您可以将所有指向类的指针转换为封装了shared_ptr的代理类,并重载其"operator=="函数以检测NULL比较并计数或正确处理它们。您可以继续使用此代理类,或在计算(例如转储到日志文件)所有比较后决定是否切换到shared_ptr。


我喜欢这个和那个:类X {私有:结构体Y {}; 私有std :: shared_ptr <Y> s; } 并将内联/非内联函数转发到Y函数/数据。 - user2249683
这是一种找到它们的方法,但让代理类处理所有运算符等,而不是使用shared_ptr作为原始指针的简便替代,会显得很繁琐。我正在寻找一种总能捕捉到团队中任何人做出此类更改时的问题的方法,而不是一个我们必须遵循的流程。 - Ken Moynihan
花一些时间在这个代理类上是一次性的努力,你可以确信将来不会错过这样的错误。通常它太复杂了,无法通过一些静态代码分析方法发现,例如int * emptyPtr = NULL; if (aPtr == emptyPtr),或者一些复杂的模板代码。 - BartoszKP

1

我的同事提供了这个解决方案,基本上就是我想要的: 将其放入公共头文件中(并且还以相反的顺序添加了参数)

template<typename T>
bool operator!=(int null, const boost::shared_ptr<T>& p)
{   
    typedef typename T::intentional_error error;
    return false;
}

template<typename T>
bool operator==(int null, const boost::shared_ptr<T>& p)
{
    typedef typename T::intentional_error error;
    return false;
}

在所有 shared_ptr 和 int 之间的比较位置给出编译时错误。

-2

如果 (foo) 应该可以工作。同样,如果 (foo.get()) 也可以工作。


这并没有回答楼主的问题,他想知道如何检测首次选中此项。 - arne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接