0

我有 1 个父类(“区域”)和一些子类(“圆”、“多边形”等)。其中一个虚拟继承函数的行为非常奇怪——它的输入参数在运行时消失(在调试模式下可见)。它使一些记忆奇怪的错误..你有什么想法吗?(让我们假设 Segment 类运行良好)

class Point {
    int x, y;
public:
    Point(){};
    Point(int xP, int yP):x(xP), y(yP){}
};


class Area {
public:
    virtual ~Area() {
    }
    virtual bool contains(const Point& p1) const=0;
};


class Circle: public Area {
    double radius;
    Point center;
public:
    ~Circle() {}
    Circle(double radiusP, Point centerP) :
            radius(radiusP), center(centerP) {}
    bool contains(const Point& p1) const;
};

以及函数的定义(包含):

bool Circle::contains(const Point& p1) const {
    return Segment(center, p1).getLength() < radius;
}
4

1 回答 1

1

P1 是一个参考。如果 p1 被删除,或者是在 contains 运行时超出范围的临时文件,则会出现内存错误。

@lezebulon 临时超出范围的示例:

Point& getPoint()
{
    Point p;
    return p;
}

void doStuff()
{
    Point& p = getPoint(); // p is already bad... but will probably still work.
    area->contains( p ); // oops stack overwritten, p obliterated
}
于 2012-06-21T20:17:36.813 回答