在 C++ 中使用分配器时变量如何关联?
How are variables related when using an allocator in C++?
我正在研究这段代码,但我不明白 p
、q
和 r
之间的关系。我们将 p
分配给 q
并将 p
分配给 r
,然后显示 r
,即使我们在 q
.[=25 上进行递增=]
然后这个 do ... while
循环:
do {
cout<< "here" << *r << endl;
} while (++r != q);
它是如何工作的? r
和 q
等于什么?
这是完整代码:
#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
,又名“指向可变字符串的常量指针”。 q
和 r
被初始化为 p
的 副本 ,这意味着它们是 std::string *
,又名“指向可变字符串的可变指针”。
p
总是指向分配数组的第一个元素。 q
和 r
被修改为指向数组的其他元素。
第一块
auto q=p;
alloc.construct(q++);
alloc.construct(q++, 10, 'c');
alloc.construct(q++, "hi");
构造 3 个 std::string
个对象,在数组的连续位置,从第一个开始,每次递增 q
。 q
最终指向数组中最后一个 std::string
的第四个元素。
下一个区块
auto r=p;
do{
cout<< *r << endl;
}while (++r != q);
显示这些字符串。此后,q
和r
都指向数组的第四个元素。
下一个区块
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);
我正在研究这段代码,但我不明白 p
、q
和 r
之间的关系。我们将 p
分配给 q
并将 p
分配给 r
,然后显示 r
,即使我们在 q
.[=25 上进行递增=]
然后这个 do ... while
循环:
do {
cout<< "here" << *r << endl;
} while (++r != q);
它是如何工作的? r
和 q
等于什么?
这是完整代码:
#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
,又名“指向可变字符串的常量指针”。 q
和 r
被初始化为 p
的 副本 ,这意味着它们是 std::string *
,又名“指向可变字符串的可变指针”。
p
总是指向分配数组的第一个元素。 q
和 r
被修改为指向数组的其他元素。
第一块
auto q=p;
alloc.construct(q++);
alloc.construct(q++, 10, 'c');
alloc.construct(q++, "hi");
构造 3 个 std::string
个对象,在数组的连续位置,从第一个开始,每次递增 q
。 q
最终指向数组中最后一个 std::string
的第四个元素。
下一个区块
auto r=p;
do{
cout<< *r << endl;
}while (++r != q);
显示这些字符串。此后,q
和r
都指向数组的第四个元素。
下一个区块
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);