【解決方法】なぜローカル静的…


int COXEdit::Validate()
{
static CString sFullText;
	int nRet=ValidateInput();

	CString sNewText=GetInputData();
	if ((::IsWindow(m_hWnd)) && (UINT) sNewText.GetLength()>GetLimitText())
	{
		int n=0;
		for (n=0; n<sFullText.GetLength(); n++)
			m_arrInputData.SetAtGrow(n,sFullText.GetAt(n));
		m_arrInputData.SetAtGrow(n,NULL);
	}
	sFullText=COXEdit::GetInputData();
	return nRet;

}	

私が試したこと:

その変数の目的は何ですか。 私は何も見ることができず、関数ローカル静的の使用は多くの問題を引き起こします..含む(ただし、含まれるプログラムの即時クラッシュに限定されないのは、コントロールがデフォルトドメインの外部からアクセスされることです)….

解決策 1

static C++ では、使用される場所によって意味が異なります。 static 関数内の変数はアプリケーションの存続期間にわたって割り当てられ、関数が何度も呼び出されても値は保持されます。 たとえば、 static 変数をゼロに設定し、treh 関数が呼び出されるたびにそれをインクリメントすると、その関数の「呼び出しカウンター」として機能する前回の呼び出しの値が保持されます。
非静的と宣言されている場合、値は保持されません。

コードでは、文字列は関数内に保持されるため、関数が呼び出されるたびに「成長」します。

解決策 2

その変数を静的にする有用な目的はありません。 変数は割り当てられていますが、何にも使用されていないため、その存在の目的はまったくありません。 また、呼び方も GetInputData その構文は通常、静的メソッドの呼び出しに使用されるため、少し奇妙です。

そのコードを処理する必要がある場合は、次の両方の宣言をコメントアウトします sFullText そしてそれが割り当てられている行を見て、何が起こるか見てみましょう。 副作用がなければ GetInputData 関数、何も起こらないはずです。

コメント

タイトルとURLをコピーしました