相対パス (例: "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_t
delete[]
このようなものを作成する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
必要です。途方に暮れているので、ここで何か助けていただければ幸いです...