我们需要为gcnew创建指针验证吗?

时间:2016-06-07 12:39:26

标签: c++ validation memory c++-cli

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 ?
  {

1 个答案:

答案 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;
}

如果常规对象分配的内存条件不足,只需让程序死掉即可。试图以这种方式治愈它不会让你走得很远。

这种代码可以接受的唯一地方恕我直言,当你试图动态分配一个可能很大的数组时,你知道如果你不能这样做就可以取消该操作。不要试图捕获每个分配的分配错误,这会使代码膨胀并导致你无处可去。