【问题标题】:Initializing pointer of itself through the function c++通过函数c++初始化自身的指针
【发布时间】:2022-01-09 16:20:15
【问题描述】:

这是一个类,该类的变量之一是一个指针,该指针指向由同一类制成的对象。我想引用一个子对象(新点对象),但是当我从主函数调用函数 getChild() 时,它会引发访问冲突读取位置异常。看起来新建一个Point对象是没有问题的,但是函数执行的时候指针(*child)又变回了null。如何防止指针指向 null?

class Point {
private:
    double x;
    double y;
    Point *child;
public:
    Point(double a, double b){
        x = a;
        y = b;
    }
    Point getChild() {
        return *child;
    }
    void createChild(double a, double b) {
        child = new Point(a, b);
    }
}

【问题讨论】:

  • 你应该包括调用代码
  • 你确定你创建一个子点之前你尝试get它?您的类中没有构造函数,因此 child 成员最初具有未定义的值。如果您在 createChild() 创建子对象并正确初始化指针之前尝试访问子对象,则会调用未定义行为,在这种特定情况下会导致访问冲突。
  • 请提供minimal reproducible example 证明您的观察结果使您认为“函数执行时指针 (*child) 回到 null”。
  • 只是一个小问题:Point 为什么要生孩子?

标签: c++ pointers access-violation


【解决方案1】:

您的代码有多个问题:

问题 1

您不会在构造函数中初始化 child,而是在每次调用 createChild 访问“随机”内存之前调用 getChild

问题 2

每次调用 getChild 时,您都会创建一个副本,这可能不是您想要的,这使得处理您的 child 指针变得困难(因为它也被复制 -> 谁拥有指向的对象现在?)

问题 3

您不会在getChild 中检查nullptr

问题 4

您不会在 createChilddelete 旧的 child(并且您不会在析构函数中删除它)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多