0

相対パス (例: "log\crash.txt") をフル パス (例: "E:\Program\log\crash.txt") に変換する関数があります。機能は次のとおりです。

string_t GetAbsPath(string_t relPath)
{
    char abs[1024];

    //Get the working directory
    GetCurrentDirectory(1024, abs);

#pragma warning(disable:4996)
    //Add a slash and content folder
    memcpy(&abs, strcat(abs, "\\content\\"), 1024);
    //Append it to the relative path
    memcpy(&abs, strcat(abs, relPath.c_str()), 1024);
#pragma warning(default:4996)

    return abs;
}

string_tは私が書いたクラスで、基本的にはconst char*. 私の問題は、(そして私はこれを予想していました...) 関数が戻り、abs範囲外にstring_tなり、戻り値を取得する が空/ジャンクになることです。このような状況では、通常memcpy、スコープ外に出ないポインターにコピーするために使用します。しかし、そこにある問題は、そのポインター ( const char*in になる) を'dstring_tにする必要があることです。そもそもデストラクタがありません。私はそれをそこに書くことができましたが、それには別の問題があります:delete[]string_tdelete[]

このようなものを作成するstring_tと:

string_t crash = "New[] isn't called! Ahh!";

デストラクタでこれにアクセスするdelete[]と、new[] が呼び出されなかったため、プログラムがクラッシュします。

delete[]次のように、const char*を呼び出す関数内でを使用できGetAbsPathます。

void LoadModel(string_t relPath)
{
     string_t fullPath = GetAbsPath(relPath);
     . . .
     delete[] fullPath.c_str();
}

しかし、後でコードに戻ってきたら、「なぜdelete[]そこにあるのか」と思うか、不要なときに追加することを知っています...そしてポインタは、たくさんありますそこにエラーの余地があります。

そのcharをスコープ内に保持し(これはポインターでのみ実行できると思います)、割り当てられたメモリが確実にクリーンアップされるようにするにはどうすればよいですか? std::string はすべてをきれいに保ち、連結などの機能を備えているため、方法がstring_t必要です。途方に暮れているので、ここで何か助けていただければ幸いです...

4

1 に答える 1

3

次の 3 つの選択肢があります。

1)string_tそれが指す文字列を常に所有し、その割り当て解除を担当することを決定します。コンストラクターに割り当て/コピーをさせます。

2)string_tが指す文字列を決して所有しないことを決定し、それを呼び出すコードは、必要に応じてその割り当てを解除する責任を常に負います。

3)が両方のモデルをサポートし、デストラクタでstring_t呼び出すかどうかを決定するフラグが必要になるかどうかを決定します。free[]呼び出しコードはstring_t、ポインターを割り当て/コピーするか、単にスタッシュするかを伝える必要があります。

3 のルールを必ず守ってください。または、さらに良いことに、std::string一貫してオプション 1 を使用するだけで、心配することなく使用できます。

于 2012-05-28T18:27:25.793 に答える