C 如何检测何时将nullptr传递到预期std :: string的功能

C++ How to detect when nullptr is passed to function where std::string is expected?

本文关键字:std string 功能 nullptr 何检测 检测 何时      更新时间:2023-10-16

我找不到有关此的线程 -

我有一个构造函数,例如:

FanBookPost::FanBookPost(Fan* owner, std::string content);

风扇是我代码中的另一类,但内容是有问题的:

由于STD :: String不是指针,因此我希望与(Fan,nullptr)调用构造函数是不可能的。但是,它编译了!...并在运行时崩溃,exc_bad_access。

这是可以避免的吗?

这里的问题是,当调用std::string的构造函数时,崩溃将发生(因为在那里访问了const char*的NULLPTR)。您在这里无能为力,只能告诉其他人不要做狗屎。这不是您的构造函数的问题,因此也不是您的责任(除了无法阻止它)。

您要观察到的是,您可以从字符指针中隐式创建std::string(在这种情况下为nullptr),然后将其传递给该函数。但是,不允许从空指针创建string。您的方法签名没有错,只有违反std::string构造函数的客户使用。

如果您真的想安全,请使用代理/包装器典型键

template<typename T>
struct e_t
{
public:
    inline e_t ( e_t const & other )
        : m_value( other.m_value )
    {}
    inline T & value( void )                { return m_value; }
    inline operator T&()                    { return m_value;   }
    inline e_t( const T& c ) : m_value( c )     {}
private:
    T m_value;
};
void FanBookPost(int* owner, e_t<std::string> content) {
}
int main()
{
    int n = 0;
    //FanBookPost(&n, 0); // compiler error
    //FanBookPost(&n, nullptr); // compiler error
    //FanBookPost(&n, ""); // unfortunately compiler error too
    FanBookPost(&n, std::string(""));
}

问题是std::string具有不明显的CTOR,该CTOR将char *作为其唯一(必需)参数。这给出了从nullptrstd::string的隐式转换,但给出了未定义的行为,因为该CTOR专门需要非弹药指针。

有几种防止这种情况的方法。最有效的可能是(非const)对std::string进行引用,该参考需要将(非效率)string作为参数。

FanBookPost::FanBookPost(Fan* owner, std::string &content);

这确实必须不幸地赋予该功能修改传递的字符串的副作用。这也意味着(使用一个符合编译器 1 )您将无法通过nullptr 字符串字面的字符串到该函数 - 您必须通过std::string的实际实例。

如果您想能够传递字符串文字,则可以添加一个 char const *参数的过载,也可能还要采用nullptr_t参数。前者将在创建字符串并调用引用字符串的函数之前检查非挂钩指针,后者将执行诸如记录错误并无条件杀死程序之类的事情(或者,可能是,可能会记录错误并提出例外)。

这很烦人和不便,但是 May 都优于当前情况。


  1. 不幸的是,我上次注意到MS VC 在这方面并不符合。它允许通过非const引用传递临时对象。通常这是相当无害的(它可以使您修改临时性,但通常没有明显的副作用)。但是,在这种情况下,这更麻烦了,因为您特别依赖它是为了防止通过临时对象。