gpt4 book ai didi

c++ - 为什么放在双端队列类中的共享指针在初始化期间会发生读取访问冲突?

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:16 24 4
gpt4 key购买 nike

下面的代码生成抛出异常:读取访问冲突。这是 0xFFFFFFFFFFFFFFFF7 错误:

    std::deque<std::shared_ptr<int>> a(10);
std::deque<std::shared_ptr<int>> b(&a[0], &a[2]);

但使用 int,如以下代码,它可以正常工作。

    std::deque<int> a(10);
std::deque<int> b(&a[0], &a[2]);

我尝试的其他初始化也发生了同样的情况:

    std::deque<std::shared_ptr<int>> a(10, std::make_shared<int>(1));
std::deque<std::shared_ptr<int>> b(&a[0], &a[2]);

这是为什么?

最佳答案

你所做的实际上是未定义的行为

当您执行此 b(&a[0], &a[2]) 构造函数 ( constructs with contents of a range ) 时,您正在迭代 deque 而不是迭代器但是通过引用每个成员的内存位置。您不会从指针获得连续迭代器。

A deque 在内存中不一定是连续的(例如,如果它像您的情况一样实现为链表)。这意味着您可能正在取消引用不属于您的内存。它也出现在第二个示例中,但您看不到它,因为行为未定义。

        Link               Link
_____________ _______________ ______ ...
| | |
&a[0] [other mem] &a[1] [other mem] &a[2] ...
//^^^^^^^
// When you iterate in b(&a[0], &a[2]), you iterate over this memory you dont own!

它可以做任何事情,包括抛出一个 An exception was throwed: a read access violation. 甚至可以像在您的案例中那样正常工作。 Read about undefined behaviour here.

你可以正确地初始化它:

std::deque<std::shared_ptr<int>> b(a.begin(), a.begin() + 2);

See a live example here.

关于c++ - 为什么放在双端队列类中的共享指针在初始化期间会发生读取访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47765328/

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