C ++ STL容器和指针有效性

时间:2010-12-05 09:07:07

标签: c++ pointers stl

考虑这段代码:

Uint counter = 0;

int* p1;
int* p2;

deque<int>  dequeInstance;
vector<int> vectorInstance;

dequeInstance.push_back(3);
dequeInstance.push_back(7);

p1 = &dequeInstance.back();

dequeInstance.push_back(17);

p2 = &dequeInstance.back();

if(*p1 == !7)
    ++counter;

if(*p2 == !17)
    ++counter;

vectorInstance.push_back(3);
vectorInstance.push_back(7);

p1 = &vectorInstance.back();

vectorInstance.push_back(17);

p2 = &vectorInstance.back();

if(*p1 == !7)
    ++counter;

if(*p2 == !17)
    ++counter;



return counter;

我原本以为当我将第三个元素推到向量的后面时,指向第二个元素的指针就会失效,因为我对std :: vector的理解是它的一个直的数组被擦除了每次修改时重新创建。到这段代码结束时,'counter'等于零。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:5)

希望性能方面,每次修改时都不会“擦除并重新创建std::vector”。

向量的capacity可能超过其size,这意味着它可以分配比真正使用的内存更多的内存。当您push_back时,仅当新大小大于旧容量时才会重新分配,而在这种情况下 ,迭代器将失效。

在您的情况下,您应该在capacity实例化后立即检查std::vector的值。您将看到它毫无疑问大于3,因此,您的push_back调用都不会触发重新分配,并且所有迭代器都保持有效。

另请注意,std::vector提供了reserve成员函数,可用于控制向量容量。当您知道要插入多少元素以避免重新分配时,这非常有用。

答案 1 :(得分:2)

好的,你有一些问题。首先,!n = 0,除非n = 0然后它等于1.因此计数器永远不会增加。

其次,当你推送一个新元素时,向量不一定会破坏内容。矢量有2“大小”。 1是向量中的元素数,2是分配的内存量。仅当分配的内存量用完时,才会重新分配和复制向量。

此外,在删除内存区域后,内存不一定被清除,仍可能指向有效数据。

您没有使用迭代器,因此它们不会失效。您正在使用指针,它们只是指向一个内存区域。仅仅因为没有分配内存并不意味着指针无效。这是C / C ++可能带给您的主要危险之一。确保你不要做这样的事情,因为你正在调用“未定义的行为”,它可以做任何事情,从“不引起任何问题和看似工作”到“可怕的崩溃并以危险的方式降低你的操作系统”。 / p>