バグ:文字列を返却する関数

Posted: 2013年03月11日

文字列の返却する関数処理でよく書いてしまうバグを紹介します。
最近よくある話題ですが
処理としては問題ないけど、それで大丈夫?なコードです。

プログラムプログラム:

 #include <stdio.h>
 #include <stdlib.h>

 CString GetLoginUserName()
 {
  CString strUserName;

  // 処理

  return strUserName;
 }

 int main(int argc, char *argv[])
 {
    CString strUserName = GetLoginUserName();

    return 0;
 }

このプログラムにどのような文字列の長さ取得処理のバグがあると思いますか?

  • GetLoginUserNameの返却値が何度もコピーされるため
     パフォーマンスが劣化します。

改善版プログラム改善版プログラム:

 #include <stdio.h>
 #include <stdlib.h>

 void GetLoginUserName(Cstring &strUserName)
 {
  // 処理

  return strUserName;
 }

 int main(int argc, char *argv[])
 {
    CString strUserName;
    GetLoginUserName(strUserName);

    return 0;
 }

解説解説:

関数の返却値にCStringに設定した場合

  • 返却値としてコピー
  • main関数のローカル変数へコピー

2回コピーが行われます。

修正版では、
参照型で処理を行うため
アドレスのコピーのみが行われます。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント