C 如何检测何时将nullptr传递到预期std :: string的功能
C++ How to detect when nullptr is passed to function where std::string is expected?
我找不到有关此的线程 -
我有一个构造函数,例如:
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 *
作为其唯一(必需)参数。这给出了从nullptr
到std::string
的隐式转换,但给出了未定义的行为,因为该CTOR专门需要非弹药指针。
有几种防止这种情况的方法。最有效的可能是(非const)对std::string
进行引用,该参考需要将(非效率)string
作为参数。
FanBookPost::FanBookPost(Fan* owner, std::string &content);
这确实必须不幸地赋予该功能修改传递的字符串的副作用。这也意味着(使用一个符合编译器 1 )您将无法通过nullptr
或字符串字面的字符串到该函数 - 您必须通过std::string
的实际实例。
如果您想能够传递字符串文字,则可以添加一个 char const *
参数的过载,也可能还要采用nullptr_t
参数。前者将在创建字符串并调用引用字符串的函数之前检查非挂钩指针,后者将执行诸如记录错误并无条件杀死程序之类的事情(或者,可能是,可能会记录错误并提出例外)。
这很烦人和不便,但是 May 都优于当前情况。
- 不幸的是,我上次注意到MS VC 在这方面并不符合。它允许通过非const引用传递临时对象。通常这是相当无害的(它可以使您修改临时性,但通常没有明显的副作用)。但是,在这种情况下,这更麻烦了,因为您特别依赖它是为了防止通过临时对象。
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 重载 + 自己的类和 std::string 的运算符
- 如何使用 std::string 作为 QHash 的键?
- 将日语 wstring 转换为 std::string
- 可以从std::string继承以提供类型一致性吗
- 构造函数采用std::string_view与std::string并移动
- 在共享缓冲区内存中创建 ::std::string 对象
- std::string.size() 未知行为
- Valgrind 在 std::string::swap 中报告 SIGILL