当我尝试在类构造函数中引用 *this 时,为什么会收到“写入访问冲突:这是 0x7FF895E32BB3”?

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

我有一个程序,需要在类的 (A) 构造函数中创建一个类 (B),并引用将其传递到其 (B) 构造函数的类 (A)。我知道这是垃圾描述,但我不知道如何更好地表达它。

我在运行时收到错误,它指向 B 的构造函数,其中对 A 的引用被分配给变量。

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

class A;

class B {
public:
    B();
    B(A &a);
    ~B();
private:
    A *m_a;
};

class A {
public:
    A();
    A(int x);
    ~A();
private:
    B m_b;
};

B::B() {}

B::B(A &a) {
    *m_a = a; //           Exception thrown: write access violation.
} //                       this->m_a was 0x7FF895E32BB3.

B::~B() {}

A::A() {}

A::A(int x) {
    m_b = B(*this);
}

A::~A() {}

int main() {
    A temp = A(10);
}

我尝试添加和删除默认构造函数,并且尝试仅为

m_b = B(*this)
行创建一个单独的函数,因为与此类似的其他帖子似乎表明
*this
不起作用,因为对象
*this
指的是尚未完全完成。

调用堆栈:

[External Code]
main() Line 40
A::A(int x) Line 32
B::B(A & a) Line 24

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

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

提前感谢任何提供帮助的人,并对奇怪的代码表示歉意 - 我对 C++ 还很陌生

c++ class pointers constructor
1个回答
1
投票
*m_a = a;

这需要现有指针

m_a
,并且对象
a
被分配给
m_a
已经指向的任何东西。 不幸的是,这个

m_a

是一个完全未初始化的指针,它是随机垃圾,并且包含未定义的行为。

目前尚不清楚所显示代码的确切意图是什么。也许这里的目的是将

设置m_a

a
的地址,或者
m_a=&a;

在 C++ 中使用指针时,了解指针和它们指向的对象是

不同的、独立的实体,这一点很重要。每一个都可以分配给,了解根本差异很重要。 这应该解决这里立即未定义的行为,但是这种总体方法有点容易出错,并且通常会导致其他地方出现未定义的行为,但就崩溃的原因而言,就是这样。

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