1

我有这样的功能:

void Test(std::wstring test1)
{
   cout << test1.c_str();
}

当我这样称呼它时:

Test(NULL);

我得到运行时异常,如“无效句柄”,整个程序崩溃。我不能对参数“test1”进行空检查,因为编译器说它不能为空。我想要么首先防止 NULL 被传递,要么有办法在运行时检查 NULL。我怎么解决这个问题?

4

2 回答 2

7

不幸的是,在这种情况下,您只需要编写正确的代码:空指针可隐式转换为wstring(通过 C 字符串构造函数),并且该构造函数要求 C 字符串指针非空。

您必须调用Test. 你可以实现一个重载来帮助解决这个问题:

void Test(const wchar_t* test1)
{
    if(test1) Test(std::wstring(test1));
}

请注意,这可能会隐藏问题,您可能希望在重载Test函数中断言和/或简单地修复调用代码,使其从一开始就不会传入无效字符串。

于 2013-07-18T21:08:06.907 回答
1

的规范std::wstring说你不能传递NULLwstring的构造函数。这样做会导致未定义的行为。

为避免这种情况,您可以重载您的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构造函数。

于 2013-07-18T21:10:00.417 回答