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

do we need to create an pointer validation for gcnew

1) 我们是否需要对 cli.conf 中的以下代码进行指针验证?拥有好不好?

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 构造使用异常来创建不成功的对象,这与 return 空指针的 C 函数不同。

在普通 C++ 中,new 在这种情况下会抛出 std::bad_alloc if memory cannot be allocated. In C++/CLI, gcnew will throw System::OutOfMemoryException

在大多数情况下,您可能应该让异常传播并杀死您的程序,因为它可能注定要失败。


在您的第二个示例中,您 可能 想要验证 foo_2 中的指针,仅当您希望有人使用空指针调用 foo_2 时,以及什么时候是有效的用法。如果将空指针作为参数传递给它是无效的用法,那么你就有了一个错误,可能会让你的应用程序崩溃(而不是让它破坏你的数据)。如果 foo_2 仅对分配后立即调用它的代码可见,则没有必要,因为它永远不会为空。

第三个例子也一样。您的函数的 contract/documentation 应指定使用空指针调用它是否有效,以及它的行为方式。

并且,不要永远写:

catch(std::bad_alloc &error)
{
    std::cout << error.what() << std::endl;
}

如果你在常规对象分配上遇到内存不足的情况,就让你的程序死掉吧。尝试以这种方式治愈它不会让你走得太远。

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