在 C++ 中使用分配器时变量如何关联?

How are variables related when using an allocator in C++?

我正在研究这段代码,但我不明白 pqr 之间的关系。我们将 p 分配给 q 并将 p 分配给 r,然后显示 r,即使我们在 q.[=25 上进行递增=]

然后这个 do ... while 循环:

do {
    cout<< "here" << *r << endl;
} while (++r != q);

它是如何工作的? rq 等于什么?

这是完整代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    allocator<string> alloc;
    auto const p = alloc.allocate(5);
    auto q=p;
    alloc.construct(q++);
    alloc.construct(q++, 10, 'c');
    alloc.construct(q++, "hi");
    auto r=p;
    
    do{
        cout<< *r << endl;
    }while (++r != q);
    
    std::cout<<"done"<<endl;
    
    while (q != p){
        alloc.destroy(--q);
    }
    
    q=p; r=p;
    alloc.construct(q++, 10, 'a');
    alloc.construct(q++, "hi again");
    
    do{
        cout<< "here" << *r << endl;
    }while (++r != q);
    
    alloc.deallocate(p, 5);
}

输出为:

output:
cccccccccc
hi
done
hereaaaaaaaaaa
herehi again

p 是一个 std::string * const,又名“指向可变字符串的常量指针”。 qr 被初始化为 p 副本 ,这意味着它们是 std::string *,又名“指向可变字符串的可变指针”。

p 总是指向分配数组的第一个元素。 qr 被修改为指向数组的其他元素。

第一块

auto q=p;
alloc.construct(q++);
alloc.construct(q++, 10, 'c');
alloc.construct(q++, "hi");

构造 3 个 std::string 个对象,在数组的连续位置,从第一个开始,每次递增 qq 最终指向数组中最后一个 std::string 的第四个元素。

下一个区块

auto r=p;    
do{
    cout<< *r << endl;
}while (++r != q);

显示这些字符串。此后,qr都指向数组的第四个元素。

下一个区块

while (q != p){
    alloc.destroy(--q);
}

以相反的构造顺序销毁这些字符串中的每一个。 q 最终指向第一个元素,与 p.

相同

下一个块的第一条语句是重言式,它将q设置为它当前的值,然后再构造2个字符串。 r 也重置为 p

q=p; r=p;
alloc.construct(q++, 10, 'a');
alloc.construct(q++, "hi again");

下一个块显示这些新字符串,在“此处”之前。

do{
    cout<< "here" << *r << endl;
}while (++r != q);

最后,数组被释放,没有破坏 std::string 个对象。这可能会泄漏字符串分配的内存,因为它们的析构函数不是 运行.

alloc.deallocate(p, 5);