如何确保最近创建的区域指向NULL?

时间:2012-04-30 09:18:20

标签: c++

如何确保堆区域中每个分配的新空间最近创建的指针向量元素指向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?

5 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,一个简单明了的解决方案是让resize()自己通过NULL as second argument作为新创建项目的默认值:

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); 
}

答案 1 :(得分: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,但它可能会。所以它可能足以进行调试。如果你想到的目的不是调试,请说出它是什么,因为如果没有调试那么你的目的是非法的,否则我们中的一个人误解了什么。

答案 2 :(得分:0)

为什么除非它被构造,否则你需要它为NULL?如果您创建一个包含10个对象的向量,然后将一个额外的第11个项目推送到向量上,那么向量可以保留足够的空间用于另外10个项目,但除非您推送,否则您无法使用这些项目将数据放到矢量上以增加其大小,或者调用resize

sizecapacity

不同

答案 3 :(得分:0)

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

向量的capacitysize之间存在重要差异。

答案 4 :(得分:0)

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

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