0

タイトルに問題点を明確に述べることはできませんが、これは本当です。

void DChatbox::ClampObject(DTextbox _txtbox) {

    this->_txtbox = &_txtbox;

}

_txtboxこれは、それを参照しないコピーを作成するだけです。

しかし、これは機能します。

void DChatbox::ClampObject(DTextbox* _txtbox) {

    this->_txtbox = _txtbox

}

私が最初のものを調べたとき、それはそれを参照するのではなく、それのコピーを作成するだけです。なんでそんなの?

注: _txtbox onDChatboxはこのように宣言されていますDTextbox* _txtbox

4

2 に答える 2

2

最初のケースでは、ポインター メンバーにはDTextbox、関数に対してローカルであり、関数スコープ{ }が終了するまでのみ存続することが保証されているオブジェクトのアドレスが割り当てられます。関数の外部
を参照すると、 Undefined Behaviorが得られます。this->_txtboxDChatbox::ClampObject

2番目のケースでは、ポインターメンバーは関数に渡されるオブジェクトのアドレスに割り当てられ、おそらく(それを呼び出すコードを表示しない限り言うのは難しい)関数に渡されるそのオブジェクトの有効期間はプログラムにとって十分な長さです正しく動作するため、正しく動作します。

于 2013-02-03T13:40:10.793 に答える
1

これは、最初のバージョンが引数を値で渡すためです。つまり、オブジェクト全体のコピーを作成します。メソッドが完了すると、単にコピーが削除されます。したがって、そのローカル オブジェクトのアドレスは、削除されたオブジェクトを指しているため、メソッドが完了すると無効になります。

2 番目のバージョンは、ポインターを使用して引数を渡すため、ポインターはオブジェクトのコピーではなく、実際のオブジェクトを参照します。したがって、メソッドが完了すると、ポインターの値は、まだ存在するオブジェクトを指しているため、同じままです。

于 2013-02-03T13:41:08.667 に答える