如何确保堆区域中每个分配的新空间最近创建的指针向量元素指向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?
答案 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
。
size
与capacity
答案 3 :(得分:0)
你为什么需要那个? vector
无论如何都不允许您访问这些元素。扩展它的容量是向量的实现细节,并且在分配的空间中元素的值是不相关的。一旦你push_back
某个元素,或者resize
具有给定值的向量,这些元素就会被覆盖。
向量的capacity
和size
之间存在重要差异。
答案 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答案。