【问题标题】:Read access violation error when declaring a class with a dereferenced pointer使用取消引用的指针声明类时出现读取访问冲突错误
【发布时间】:2021-05-08 02:27:38
【问题描述】:

我正在尝试编写一个函数,该函数从指向其他类对象的两个指针创建一个类对象,但我不断收到读取访问冲突错误。 我的程序有三个类:

class A {
    public:
        A(const A& a2); // Special copy constructor
    private:
        int a = 0;
}

class B {
    public:
        B(const B& b2); // Special copy constructor
    private:
        int b = 0;
}

class C {
    public:
        A* aPtr;
        B* bPtr;
}

我想要做的是有一个函数,它接受一个指向 A 对象和 B 对象的指针,然后将它们取消引用到 C 实例中。复制对象本身很重要,因为它是用于多线程目的。函数例如:

void foo(A* ptrA, B* ptrB){
    C* ptrC = new C();
    *ptrC->aPtr = *A;
    *ptrC->bPtr = *B;
}

但这给了我一个读取访问冲突错误。 我究竟做错了什么?我知道对象本身被复制而没有错误,所以我认为这与我如何声明 ptrC 或取消引用 ptrC->A 和 ptrC->B 有关。我是对的吗? 什么是可能的解决方案?

提前致谢。

【问题讨论】:

  • 但这给了我一个读取访问冲突错误 -- 请发minimal reproducible example
  • *ptrC->A = *A; 是三星级程序员的新转折。
  • 你永远不会初始化C::aPtr或'C::bPtr
  • @FrançoisAndrieux 对不起,我的错。我会解决的。
  • 其实它们是初始化的,但是由于使用了括号nullptr,所以初始化为C* ptrC = new C();。否则你有一个观点——没有括号,这些成员就不会被初始化。

标签: c++ class pointers debugging memory-management


【解决方案1】:

是的,几乎可以尝试:

void foo(A* ptrA, B* ptrB){
    C* ptrC = new C();
    ptrC->aPtr = ptrA;
    ptrC->bPtr = ptrB;
}

改为 (并尽量避免下次他们永远不会帮助你的指针)

【讨论】:

  • 欢迎,也许解释一下为什么你的解决方案是正确的。就我个人而言,我发现指针对很多事情都很有用。
  • 是的,对不起,所以基本上最初的问题是试图设置类的指针,而不是简单地传递类的实际实例,这没有任何意义
【解决方案2】:
A(const A& a2); // Special copy constructor

所谓的“特殊复制构造函数”通常称为转换构造函数。

但这给了我一个读取访问冲突错误。我在做什么 错了吗?

C* ptrC = new C();

这会创建一个动态对象并通过值对其进行初始化。作为成员的指针的值初始化为 null。

*ptrC->aPtr = *A;
*ptrC->bPtr = *B;

在这里,您通过那些空指针间接写入内存。这会导致未定义的行为。

什么是可能的解决方案?

不要通过空指针间接。也许在 C 对象中存储 A 和 B 对象而不是指针更适合您的设计?

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2018-02-14
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多