3

プログラムには、さまざまな図形を描画したり、図形にイベントを追加したりするために使用する特定のクラスがありました。

vector<XQuad*> _inputMappedShape;
void addRegularShape(Container inputPoints, Container outputPoints){
XQuad quad;
setInputPoints(quad, somePoints);
setInputPoints(quad, somePoints);
setArrowHandles(quad, somePoints);
_inputMappedShape[currentIndex++] = &quad;
}

XQuad* getMappedShape(int index){
return _inputMappedShape[index];
}

void setInputPoints(XQuad& quad, Point* somePoints);
void setOutputPoints(XQuad& quad, Point* somePoint);
void setArrowHandles(XQuad& quad, Point* somePoint);

上記のコード ( method 内) では、他のメソッドをコレクションに追加する前に参照addRegularshape渡ししていることに注意してください。quadvector

私のメイン プログラムではgetMappedShape、目的のためにクワッドへのポインターを返すメソッドを使用して形状を取得しようとしていました。
XQuad* returnedShape = getMappedShape(0)

quadメソッドで割り当てられたメモリアドレスとaddRegularShape、ポインターによって返されるアドレス(メソッドからgetMappedShape)を確認しましたが、メモリアドレスは同じでした。
しかし、どういうわけか、XQuadから返されたときのクラス内のデータgetMappedShapeは正しくなく (つまり、他の 3 つのメンバー関数の XQuad 参照オブジェクトで変更されたものではない)、代わりにいくつかのガベージ値がありました。なぜそうなったのか原因がわかりませんでした。メモリが壊れているのではないかと疑い、addRegularShapeto ポインタの参照オブジェクトを次のように変更しました。
XQuad* quad = new XQuad();

これに続いて、プログラムは正しい値を返し始めましたが、なぜそれが起こったのかについてはまだ少し疑問がありますか? XQuad オブジェクトを追加することは、アドレスをコレクションに追加する正しい方法ではありませんでしたか? または、ここにスコープの問題がありますか。つまり、メソッドがスコープ外になると、オブジェクトが破棄され、コレクションから実際に返されるものがガベージ値になりましたか?

4

3 に答える 3