使用new动态地将对象数组分配给指针:“可能未初始化的指针”

时间:2017-03-31 03:54:00

标签: c++ pointers dynamic-memory-allocation

以下函数必须为对象数据库分配内存,并指定一个指向对象数组的指针。

然后,指针将使用指针算法循环数组,并在用户输入后将每个对象初始化为正确的值。

以下代码不起作用:

//**********************************************************************
//*                        Get Database Records                        *
//**********************************************************************
record* get_records_database(int quantity)
{
   record *p_database; // Pointer to the records database
   record *p_record;   // Pointer to each object in the database
   int    index = 1; // Number of objects in the database

   // Allocate a database of object records
   try
   {
      p_database = new record[quantity];
   }
   catch (bad_alloc xa)
   {
      fatal_error(ALLOC_ERR, "get_records_database", 
                             "object records database");
   }

   // Loop processing object records until the database is filled
   // --- //

   // Test:
   p_database->set_amount(400);
   p_database->get_amount();

   return p_database;
}

我面临的问题是在VisualStudio中修复以下编译器错误:错误C4703:使用了未初始化的本地指针变量'p_employee_database'。

这是一个项目;使用new,try,catch和pointers是必需的;该函数的结构是必需的(此时并非全部写入);指向类的指针的返回值是必需的。我的老师非常严格地严格遵守他的要求。

非常感谢任何有助于解决此错误的帮助。谢谢;)

1 个答案:

答案 0 :(得分:2)

您的代码至少存在两个问题:

   try
   {
      p_employee_database = new employee_bonus_record[employee_quantity];
   }
   catch (bad_alloc xa)
   {
      fatal_error(EMPLOYEE_ALLOC_ERR, "get_employee_records_database", 
                                      "employee bonus records database");
   }
   //.. rest of code, assuming p_employee_database is ok.

如果抛出异常,则p_employee_database未初始化,但是您无法从函数返回。相反,你的逻辑继续使用p_employee_database,好像没有任何错误,因此编译器警告。

即使您声明fatal_error调用exit(),编译器也看不到这一点。它只查看该代码块并发出警告。如果要取消警告,可以返回nullptr

   try
   {
      p_employee_database = new employee_bonus_record[employee_quantity];
   }
   catch (const bad_alloc& xa)
   {
      fatal_error(EMPLOYEE_ALLOC_ERR, "get_employee_records_database", 
                                      "employee bonus records database");
      return nullptr;
   }

代码的第二个问题是你应该通过const引用catch std::bad_alloc而不是值。请参阅this article