gpt4 book ai didi

c++ - std::allocator:是否允许在 C++ 中构建未分配的内存?

转载 作者:行者123 更新时间:2023-11-30 03:23:18 24 4
gpt4 key购买 nike

<分区>

所以我对 C++ 比较陌生,最近遇到了 std::allocator类(class)。我知道这是用于创建 vector 的强大工具小号,list小号,deque s 等,我正在尝试了解更多相关信息。让我感到困惑的一件事如下:

例如,如果我们定义一些 allocator<int>表示为 alloc ,我们用它来分配 n通过 auto const b = a.allocate(n) 在内存中的位置, 其中b是指向第一个 int 的指针分配内存中的元素,那么,为了实际访问它,也有义务构造分配内存,对吗?如果我们引入一些迭代指针 auto e=b , 然后可以通过 alloc.construct(e++,int_obj) 进行构建, 其中int_objint 类型的一些用户初始化对象.只要对 construct 的总调用量,这一切都很好,很温顺。小于 n .但是,我不太确定当用户调用 construct 的数量时会发生什么。超过 n .我最初预计会出现一些警告或错误消息,但什么也没有发生。作为一个简单的例子,下面是我尝试运行的代码片段:

int n{ 0 };                            // Size of the array is initialized to 0.
cin >> n; // User reads in the size.
allocator<int> alloc; // 'alloc' is an object that can allocate ints.
auto const b = alloc.allocate(n); // Pointer to the beginning of the array.
auto e = b; // Moving iterator that will point to the end of the array

for (int i = 0;i != 10;++i)
alloc.construct(e++, i); // We start constructing 10 elements in the array, regardless of the size n, which can in principle be less than 10.
for (auto i = b;i != e;++i)
cout << *i << "\t";

最初我为 n=1 运行此代码,一切都很好;它打印出从 0 到 9 的数字,即使我只为一位数字分配了空间。那已经是危险信号了,对吧?然后我改变n2 , 程序在打印数字四后中断,这更符合我的预期。

我从这个行为中得出的结论是,试图通过 std::allocator 构建尚未分配的内存是未定义和不可预测的,因此应该避免(一开始就很明显)。但是,这似乎是一个极其危险的陷阱,我想知道 C++ 中是否有一些内置的变通方法可以始终阻止用户尝试构造未分配的内存。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com