1) 我们是否需要对 cli.xml 中的以下代码进行指针验证?拥有它好吗?
NameClass NameString^ = gcnew NameClass();
if (NameClass)
{
// some process
2) 如果我们在一个函数中创建了一个内存并作为指针传递给另一个函数,我们是否需要进行验证?
foo()
{
try {
NameClass *pNameString = new NameClass();
foo_2(pNameString);
} catch(std::bad_alloc &error)
{
std::cout << error.what() << std::endl;
}
}
foo_2(NameClass *pNameString)
{
if (pNameString) // do we need to validate here ?
{
// some stuff
}
}
3) 我们是否需要在引用传递中验证本地创建的对象?
NameClass objNameClass;
foo(&objNameClass);
foo(NameClass *objNameClass)
{
if (objNameClass) // do we need to validate here ?
{
最佳答案
它在 gcnew
之后和在 new
之后一样不必要。仅当出于某种原因使用 malloc
等 C 分配器时才有必要。 C++ 和 C++/CLI 构造对不成功的对象创建使用异常,这与返回空指针的 C 函数不同。
在普通 C++ 中,new
将抛出 std::bad_alloc
如果无法分配内存。在 C++/CLI 中,gcnew
将抛出 System::OutOfMemoryException
在那种情况下。
在大多数情况下,您可能应该让异常传播并杀死您的程序,因为它可能注定要失败。
在您的第二个示例中,您可能仅在希望有人使用空指针调用foo_2
时才想验证foo_2
中的指针,以及何时是有效用法。如果将空指针作为参数传递给它是无效的用法,那么你就有了一个错误,可能会让你的应用程序崩溃(而不是让它破坏你的数据)。如果 foo_2
仅对分配后立即调用它的代码可见,则没有必要,因为它永远不会为 null。
与第三个示例相同。您的函数的契约(Contract)/文档应该指定使用空指针调用它是否有效,以及它的行为方式。
请永远不要这样写:
catch(std::bad_alloc &error)
{
std::cout << error.what() << std::endl;
}
如果您在常规对象分配时遇到内存不足的情况,就让您的程序死掉吧。尝试以这种方式治愈它不会让你走得太远。
恕我直言,这种代码唯一可以接受的地方是当您尝试动态分配一个可能很大的数组时,并且您知道如果您不能这样做,您可以取消该操作。不要试图捕获每个分配的分配错误,这会使您的代码膨胀并导致您无处可去。
关于c++ - 我们需要为 gcnew 创建指针验证吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37679644/