-2

如何确保对于堆区域上每个分配的新空间,最近创建的指针向量元素指向 NULL ?

 Ex:
   vector < Sometype* >

   vector ----------------------
          |  |  |  | ...       |
          ----------------------

   new element is pushed back but no available area so double space

   index                         x  x+1            y
   vector -------------------------------------------
          |  |  |  | ...       |   |   | ...        |
          -------------------------------------------

                               ^^^^^^^^^^^^^^^^^^^^^
                                 recently created

         x, x+1, ... y all points to the NULL 

我希望最近创建的部分上的每个空间都指向 NULL ?

4

5 回答 5

0

如果我正确理解了您的问题,一个简单的解决方案是调用resize()自己NULL 作为第二个参数传递,用作新创建项目的默认值:

if (v.size() == v.capacity()) //vector is full
{
    //compute the new size
    size_t newSize = 2 * v.size();

    //second argument is the default value for newly added items
    v.resize(newSize, NULL); 
}
于 2012-04-30T09:25:21.293 回答
0

这个新空间是向量容量的一部分,但不是大小的一部分。您不需要关心它包含什么值,因为无论如何您都不允许访问它。除了您推回的一个值之外,额外的空间不是“向量的元素”,它只是未使用的空间。

就标准而言,如果需要,实现可以使用它来存储有意义的东西。例如,一个实现可以合法地将一些引人注目的值存储在未使用的内存中,这与您希望未使用的内存包含空指针的愿望相冲突。

你可以这样写代码:

v.push_back(some_value);
if (v.capacity() > v.size()) {
    size_t oldsize = v.size();
    v.resize(v.capacity(), NULL);
    v.resize(oldsize);
}

无法保证一旦您再次调整大小,这实际上会将内存设置为 0,但它可能会。所以它可能足以用于调试。如果您的目的不是调试,请说出它是什么,因为如果不是调试,那么您的目的是非法的,或者我们中的一个人误解了某些东西。

于 2012-04-30T09:27:28.600 回答
0

为什么你需要它为 NULL 除非它是被构造的?例如,如果您创建一个包含 10 个对象的向量,然后将额外的第 11 个项目推送到向量上,则该向量可能会为另外 10 个项目保留足够的空间,但您不能使用这些项目,除非您将项目推送到向量上以增加其大小,或者你打电话resize

size不一样capacity

于 2012-04-30T09:28:25.010 回答
0

你为什么需要那个?vector无论如何都不允许您访问这些元素。其容量的扩展是向量的实现细节,与分配空间中元素的值无关。push_back一旦你在那里,或者resize具有给定值的向量,这些元素将被覆盖。

向量之间有一个重要的区别capacitysize

于 2012-04-30T09:28:47.353 回答
0

当您将新元素推入向量并且没有空间时,尽管 std::vector 为新元素分配了额外的内存(类似于 reserve() 调用),但它不会创建它们(不调用构造函数)。请参阅展示位置“新”以了解其工作原理。没有真正的方法来为新元素强制执行某些值,因为没有新元素 - 只有为未来元素分配的原始内存块。通过使用 std::vector::at 而不是 operator[] 您可以确保您正在访问有效范围内的元素。

如果您通过调用std::vector::resize自己调整矢量大小,则只需在第二个参数中为新元素提供默认值。但是,有一个问题。当您自己调整 std::vector 的大小并且不为 std::vector::resize 的第二个参数提供值时,如果存储在 std::vector 中的值具有构造函数并对它们进行零初始化,则 std::vector 将对新元素进行值初始化除此以外。这意味着,如果你这样做std::vector<int*> v; v.resize(200);, v 的所有新元素都将被初始化为零。有关详细信息,请参阅答案。

于 2012-04-30T09:36:17.833 回答