静的ライブラリを使用してプログラムを構築しています(実際にテストします)。
このライブラリには、次のような関数を含む1つのファイルが含まれています。
string& GetString() {
static string strFilename;
return strFilename;
}
void PrintToScreen() {
printf("String: %s\n", GetString().c_str())
}
次に、main.cpp(ライブラリの外)で次のことを行っています。
GetString() = "abc";
printf("String: %s\n", GetString().c_str());
PrintToScreen();
そして、私はこの出力を取得します:
String: abc
String:
したがって、関数の2番目の呼び出し(ただし、ライブラリ内にある別のファイルから実行)は、以前の値をクリアするか、再初期化するか、独自のコピーを使用するように見えます。
GetString関数を「new」を使用するように変更しましたが、結果はまったく同じです(ところで、プログラムがクラッシュすることはありません)。
しかし、私はそれが可能であるかを理解していませんか?
私が間違っていることについて何か考えはありますか?
- - - - - - - - - - - - - - - - アップデート - - - - - - - - - ------------
- テストはシングルスレッド環境で行われます。
- 一部のプラットフォームでは動作し、一部では動作しません(Windows、MacOS、AIXで動作し、Linux、HP_UX、Solaris、FreeBSDでは動作しません...)
- 実行中にstrFilenameのアドレス(GetString内のprintf)を確認しましたが、重複のない1つの変数のように見えます(アドレスは常に同じです)
- しかし、最後のライブラリにnmがあると、次のようになります。
0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile
U _Z16GetLogprintfFilev
そして、ベースライブラリ(final libで使用)にnmを使用すると、次のようになります。
0000000000000030 T _Z16GetLogprintfFilev
0000000000000008 b _ZGVZ16GetLogprintfFilevE16strLogprintfFile
0000000000000018 b _ZZ16GetLogprintfFilevE16strLogprintfFile