为什么我在调用父类的函数时收到“读取访问冲突。_Right_data was 0xFFFFFFFFFFFFFFF7”?

问题描述 投票:0回答:1

我有一个类 (A),其中包含另一个类 (B) 的对象列表。在创建 A 类对象时,它会创建 B 类对象的列表,然后调用每个 B 对象的函数。每个 B 对象都存储对创建它们的 A 对象的引用。上述函数通过在 B 对象对对象 A 的引用上调用 get_bs() 来返回 b 对象的列表。根据我在 A 的构造函数中调用 B 对象上的函数的位置,程序要么运行,要么给出错误,我不知道不明白发生了什么变化以及为什么会发生错误。我知道这是垃圾描述,但我不知道如何更好地表达它。

我在运行时收到错误,它指向包含的文件向量中的一行,我不太理解。

这是我可以制作的重现错误的最小代码:

#include <vector>

class A;

class B {
public:
    B(A &a) : m_a(a) {}
    ~B() {}
    void func();
    B &operator=(const B &b) { return *this; };
private:
    A &m_a;
};

class A {
public:
    A() {
        for (int i = 0; i < 10; i++) {
            m_temp_bs.push_back(B(*this));
            m_bs.push_back(&m_temp_bs[i]);
            m_bs[i]->func(); // fine
        }
        for (int i = 0; i < 10; i++) {
            m_bs[i]->func(); // error ????
        }
    }
    ~A() {}
    std::vector<B*> get_bs() { return m_bs; }
private:
    std::vector<B> m_temp_bs = {};
    std::vector<B*> m_bs = {};
};

void B::func() {
    std::vector<B*> bs = m_a.get_bs();
}

int main() {
    A a = A();
}

此外,当尝试改变方向,在类定义中内联定义

B::func()
时,我在构建时遇到了不同的错误:
Use of undefined type 'A'
,我也不明白。我想这两个错误以某种方式联系在一起。

调用堆栈:

[External Code]
main() Line 40
A::A() Line 25
B::func() Line 36
A::get_bs() Line 28
std::vector<B *,std::allocator<B *>>::vector<B *,std::allocator<B *>>(const std::vector<B *,std::allocator<B *>> & _Right) Line 683     (This is in the vector file)

这是发生错误的所述矢量文件的片段:

#endif // _HAS_CXX23 && defined(__cpp_lib_concepts)

    _CONSTEXPR20 vector(const vector& _Right)
        : _Mypair(_One_then_variadic_args_t{}, _Alty_traits::select_on_container_copy_construction(_Right._Getal())) {
        const auto& _Right_data = _Right._Mypair._Myval2;
        const auto _Count       = static_cast<size_type>(_Right_data._Mylast - _Right_data._Myfirst); // Exception thrown: read access violation.
        _Construct_n(_Count, _Right_data._Myfirst, _Right_data._Mylast); //                              _Right_data was 0xFFFFFFFFFFFFFFF7.
    }

我希望 A 和 B 的名称不要太短,以免代码难以阅读。我不知道我该怎么称呼他们。

如果不深入了解我的原始程序的大量细节,我真的不知道如何描述我的目标,我认为这是不合适的。

提前感谢任何提供帮助的人,并对奇怪的代码表示歉意 - 我对 C++ 还很陌生 哦,我对 Stack Exchange 也很陌生,所以如果我问问题的方式有任何问题,请告诉我。

c++ class constructor reference access-violation
1个回答
0
投票

@molbdnilo 向我指出,向量在变大时会重新分配内存,这会使存储在其中的指针无效。事实证明,您只需为向量预分配内存即可,它可以工作 - 我将

m_temp_bs.reserve(10);
添加到 A 构造函数的开头,现在一切都可以工作了。

谢谢大家!

© www.soinside.com 2019 - 2024. All rights reserved.