c++ - 列表插入迭代器超出范围 (C++)

标签 c++ std

我有一个类 A 可以响应 doSomething() 和一些子类 BCD 全部覆盖 doSomething()B 特别有一个实例变量,它是标准库中的列表,并在响应 doSomething() 时向该列表添加元素。

在我的代码的某些部分,我创建了一个数组,其中包含指向 A 类型对象的指针。现在,如果我这样声明:

A* pointersToA[3];
pointersToA[0] = &B();
pointersToA[1] = &C();
pointersToA[2] = &D();

调用 pointersToA[0]->doSomething() 时,我得到一个 List insert iterator outside range

但是如果我这样做的话:

A* pointersToA[3];
B b = B();
pointersToA[0] = &b;
pointersToA[1] = &C();
pointersToA[2] = &D();

一切都按预期进行。

为什么会这样?

最佳答案

获取右值的地址几乎肯定迟早会导致问题(通常更早),并且在 C++ 中实际上是非法的(因此您的编译器在这方面并不是一流的)。地址不是对对象的引用;因为 C++ 不是一种垃圾收集语言,BCD 的值在使用它们的语句消失后立即消失执行。

对于您的使用,动态分配听起来像是最直接的方式:

std::array<std::unique_ptr<A>, 3> pointersToA {
    std::make_unique<B>(),
    std::make_unique<C>(),
    std::make_unique<D>()
};

关于c++ - 列表插入迭代器超出范围 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110811/

相关文章:

c++ - 使用 boost.asio 是否可以进行标记和空间奇偶校验?

C++从多个具有相同虚函数名的基类继承

c++ - 为什么 ifstream 没有读到最后?

c++ - 为什么没有 std::stou?

c++ - 为什么无序关联容器不实现小于运算符?

c++ - 什么是 c c++ 的最佳数据库连接支持库框架?

c++ - 如何在 Windows 7 上使用 DirectX 11 和 Visual Studio 2015 工具集 v140

c++ - C++ Windows 服务是否比 .Net Windows 服务更稳定?

c++ - 如何在没有 C++11 的情况下使用 std::begin 和 std::end?

c++ - 'std:;' 在 C++ 中会做什么?