我有这样的功能:
void Test(std::wstring test1)
{
cout << test1.c_str();
}
当我这样称呼它时:
Test(NULL);
我得到运行时异常,如“无效句柄”,整个程序崩溃。我不能对参数“test1”进行空检查,因为编译器说它不能为空。我想要么首先防止 NULL 被传递,要么有办法在运行时检查 NULL。我怎么解决这个问题?
不幸的是,在这种情况下,您只需要编写正确的代码:空指针可隐式转换为wstring
(通过 C 字符串构造函数),并且该构造函数要求 C 字符串指针非空。
您必须在调用Test
. 你可以实现一个重载来帮助解决这个问题:
void Test(const wchar_t* test1)
{
if(test1) Test(std::wstring(test1));
}
请注意,这可能会隐藏问题,您可能希望在重载Test
函数中断言和/或简单地修复调用代码,使其从一开始就不会传入无效字符串。
的规范std::wstring
说你不能传递NULL
给wstring
的构造函数。这样做会导致未定义的行为。
为避免这种情况,您可以重载您的Test
函数,以便传递NULL
调用不会尝试从构造的wstring
重载NULL
。
void Test(wchar_t const *test1)
{
if (test1)
std::wcout << test1;
}
void Test(std::wstring const &test1) // added const & to avoid unnecessary copies
{
Test(test1.data());
}
现在Test(NULL)
将调用wchar_t const *
重载并且NULL
永远不会传递给std::wstring
构造函数。