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

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

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/

相关文章:

c++ - make_shared 不能和 enable_shared_from_this 一起玩?

c++ - vector n 维 vector 本身具有特定的数据类型

c++ - C++ 在基于 Intel 的系统上使用的 float 的二进制格式是什么?

c# - MVVM-更改 View 模型中的字段时验证模型

c++ - 构建文件夹和makefile

javascript - PHP/JavaScript 表单验证,无效电子邮件检查

JavaScript NoGray 日历使用带有日历的下拉框而不是输入字段和日历

memory - HSET 与 SET 内存使用情况?

java - G1 垃圾收集器的高内存使用问题

c++ - 如何保护非托管应用程序中的字符串免受进程转储