第二个“if”语句中可能存在逻辑错误?

时间:2014-01-18 07:59:13

标签: c++

我不明白在这里使用第二个“if”语句。如果“Tptr”已经测试了大于零的“新容量”,它怎么能为0?其他一些数字作为“newcapacity”可以使“Tptr”为零吗?

template <typename T>
T* Vector<T>::NewArray(size_t newcapacity)
// safe memory allocator
{
   T* Tptr;
   if (newcapacity > 0)
   {
      Tptr = new(std::nothrow) T [newcapacity];
      if (Tptr == 0)
      {
         std::cerr << "** Vector error: unable to allocate memory for array!\n";
         exit (EXIT_FAILURE);
      }
   }
   else
   {
      Tptr = 0;
   }
   return Tptr;
}

3 个答案:

答案 0 :(得分:5)

因为它之前的这一行是必要的:

Tptr = new(std::nothrow) T [newcapacity];

以上是no-throw version of new[],当分配失败时返回空指针。所以下一行必然意味着它正在检查new[]分配是否失败。

if (Tptr == 0) // Check if allocation failed
{
   // Allocation has failed
   std::cerr << "** Vector error: unable to allocate memory for array!\n";
   exit (EXIT_FAILURE);
}

答案 1 :(得分:2)

当机器内存不足并且你要求它不要抛出异常时,它会返回值为0的nullptr

答案 2 :(得分:-1)

如果new返回NULL怎么办?使用mallocnew后,您应始终进行空检查。