0

1 つの親クラス (「エリア」) といくつかの子クラス (「円」、「ポリゴン」など) があります。仮想継承関数の 1 つが非常に奇妙な動作をします。実行時に入力パラメーターが消えます (デバッグ モードで表示されます)。それはいくつかのメモリ奇妙なエラーを引き起こします..何か考えはありますか?(セグメントクラスがうまく機能していると仮定しましょう)

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 に答える