C++ 如何在将NULL传递给std::wstring时防止运行时崩溃?

C++ 如何在将NULL传递给std::wstring时防止运行时崩溃?,c++,string,C++,String,我有这样一个函数: void Test(std::wstring test1) { cout << test1.c_str(); } Test(NULL); 我遇到运行时异常,如“无效句柄”,整个程序崩溃。我不能对参数“test1”执行null检查,因为编译器说它不能为null。我想首先防止传递NULL,或者在运行时检查NULL。如何解决此问题?不幸的是,在这种情况下,您只需编写正确的代码:空指针可以隐式转换为wstring(通过C字符串构造函数),而该构造函数要求C字符串

我有这样一个函数:

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

我遇到运行时异常,如“无效句柄”,整个程序崩溃。我不能对参数“test1”执行null检查,因为编译器说它不能为null。我想首先防止传递NULL,或者在运行时检查NULL。如何解决此问题?

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

在调用
Test
之前,必须进行空检查。您可以实现一个重载来帮助实现这一点:

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

请注意,这可能会隐藏问题,并且您可能希望在重载的
Test
函数中断言和/或简单地修复调用代码,以便它不会首先传入无效字符串。

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

在调用
Test
之前,您必须执行空检查。不过,您可以实现重载来帮助完成此操作:

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

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

std::wstring的规范规定,您不能将
NULL
传递给
wstring
的构造函数o导致未定义的行为

为了避免这种情况,您可以重载
Test
函数,以便传递
NULL
调用一个重载,该重载不会试图从
NULL
构造
wstring

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());
}
void测试(wchar\t const*test1)
{
if(test1)

std::wcoutstd::wstring
的规范规定,不能将
NULL
传递给
wstring
的构造函数。这样做会导致未定义的行为

为了避免这种情况,您可以重载
Test
函数,以便传递
NULL
调用一个重载,该重载不会试图从
NULL
构造
wstring

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());
}
void测试(wchar\t const*test1)
{
if(test1)

std::wcout使用适当的标志编译代码,我认为它应该带有警告。不?嗯…不要传递
NULL
?@JonTackabury,如果您要移动到
std::wstring
,它应该在您更改调用站点以使用
std::wstring
时修复自身。如果这些都在用户的程序中,则可能会出现过载他们不更改代码的st解决方案,但您至少可以更改您设法正确调用的代码。@JonTackabury将参数类型从
LPWSTR
更改为
std::wstring
会更改接口,正如您所发现的那样。您要么必须更新客户端代码以符合新接口,要么必须执行以下操作:维护旧接口的方法(例如,通过添加一个与NULL一起工作的重载)。您希望
Test(NULL)得到什么
该怎么办?我认为您可能会将空指针与空字符串混淆。虽然其他一些字符串类可能会将空指针视为特例并构造空字符串,但它们不是一回事。您可能只需要
测试(L“”)
;使用适当的标志编译代码,我认为它应该带有警告。不?嗯…不要传递
NULL
?@JonTackabury,如果您要移动到
std::wstring
,当您将调用站点更改为使用
std::wstring
时,它应该修复自身。如果这些都在用户程序中,那么重载可能是最好的选择他们不更改代码的解决方案,但您至少可以更改您设法正确调用的代码。@JonTackabury将参数类型从
LPWSTR
更改为
std::wstring
会更改接口,正如您所发现的那样。您要么必须更新客户端代码以符合新接口,要么必须执行一些操作维护旧接口的方法(例如,通过添加一个与NULL一起工作的重载)。您希望
Test(NULL)得到什么
该怎么办?我认为您可能会将空指针与空字符串混淆。虽然其他一些字符串类可能会将空指针视为特例并构造空字符串,但它们不是一回事。您可能只需要
测试(L“”)
;我会告诉你,你可以重载它,这是与现有代码集成的最简单的解决方案,但是你可以直接输出字符串,并且应该使用
std::wcout
来做到这一点。@chris well应该避免重复的实现。虽然我展示了如何根据OP的代码实现新的重载,但我承认它会也许重构和翻转会更好。我已经用UVD:)这是第一个提出重载的建议,输出与实际答案不相关,因此它不会影响我的决定。我会告诉你,你可以重载它,这是与现有代码集成的最简单的解决方案,但是你可以直接输出字符串,并且应该使用
std::wcout
来做到这一点。@chris well one应该避免id重复实现。虽然我展示了如何根据OP的代码实现新的重载,但我同意重构和翻转可能会更好。我已经说过:)这是第一次建议重载,并且输出与实际答案无关,因此它不会影响我的决定。在调用函数或创建重载似乎是最好的(也是唯一的)实际选择。感谢您的帮助!该死,当您必须编写正确的代码时,这总是很不幸:在调用函数之前进行空检查,或创建重载似乎是错误的