1)我们是否需要对cli中的以下代码进行指针验证。有没有好处?
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 ?
{
答案 0 :(得分:1)
在gcnew
之后的new
之后就像不必要的一样。只有在出于某种原因使用malloc
之类的C分配器时才需要它。与返回空指针的C函数不同,C ++和C ++ / CLI构造对不成功的对象创建使用异常。
在普通的C ++中,如果无法分配内存,new
将抛出std::bad_alloc
。在C ++ / CLI中,gcnew
将在这种情况下抛出System::OutOfMemoryException
。
大多数情况下,您可能应该让异常传播并杀死您的程序,因为它可能无论如何都会注定失败。
在你的第二个例子中,只有当你希望有人用空指针调用foo_2
时,可能想要验证foo_2
中的指针,当它是有效使用。如果将空指针作为参数传递给它是无效的用法,那么你有一个错误,应该让你的应用程序崩溃(而不是让它破坏你的数据)。如果foo_2
仅对分配后立即调用它的代码可见,则它是不必要的,因为它不会为空。
第三个例子相同。函数的契约/文档应指定使用空指针调用它是否有效,以及它的行为方式。
请,不要曾写下:
catch(std::bad_alloc &error)
{
std::cout << error.what() << std::endl;
}
如果常规对象分配的内存条件不足,只需让程序死掉即可。试图以这种方式治愈它不会让你走得很远。
这种代码可以接受的唯一地方恕我直言,当你试图动态分配一个可能很大的数组时,你知道如果你不能这样做就可以取消该操作。不要试图捕获每个分配的分配错误,这会使代码膨胀并导致你无处可去。