1

Visual Studio 2010 で Win32 コンソール アプリケーションを作成しています。

char*パラメーターとして2 つを取る 1 つの関数を考えてみましょう。

以下は関数のプロトタイプです。

void WriteApplicationFile(char *mappname,char* MessageString)
{
   //Do some File related stuffs.
}

現在、次の呼び出しは完全に機能しています。

WriteApplicationFile("FirstOne", "Append Me");
WriteApplicationFile("FirstOne", "Append Another");

しかし、文字配列で同じことをしようとすると、アサーションが発生し、アセンブリに投げ込まれます。

次のコードは機能しません。

char * LocalBuffer  = new char[100]; 
sprintf(LocalBuffer,"Number of jobs in Queue %d",JobsCount);
WriteApplicationFile("SAAZshadowProtect",LocalBuffer);
free(LocalBuffer);
LocalBuffer = NULL;
//Work fine.
//...
LocalBuffer  = new char[100]; 
sprintf(LocalBuffer,"Log file name %s",LogFileCharName);
WriteApplicationFile("SAAZshadowProtect",LocalBuffer);
free(LocalBuffer);   // I got assertion here..
LocalBuffer = NULL;

どこが間違っていますか?

もう 1 つは、すべてのアサーションとバグを try-catch ブロックで処理したいということです。どうすればいいですか?

4

2 に答える 2

13

使用する場合は、またはではなくを使用new[]する必要があります。交換:delete[]free()delete

free(LocalBuffer);

と:

delete[] LocalBuffer;

メモリを動的に割り当てる理由はないようです。バッファーのサイズはコンパイル時の定数であり、大きくはなく (スタック オーバーフローはありません)、バッファーは割り当てられたスコープを超えて存在する必要はないようです。

これは c++であるstd::stringため、動的メモリ管理を処理し、std::ostringstreamタイプセーフであり、代わりに固定サイズのバッファーの指定を回避するものを使用することを強くお勧めしsprintf()ます。

#include <sstream>
#include <string>

std::ostringstream out;
out << "Number of jobs in Queue " << JobsCount;
const std::string s(out.str());

C スタイルの文字列へのアクセスが必要な場合は、 を使用しますstd::string::c_str()

さらに、 の引数の型WriteApplicationFile()char*ではなくconst char*であるため、文字列リテラルを関数に渡すと、関数が引数を変更した場合に未定義の動作が発生します。

于 2013-05-13T07:13:07.573 に答える
2

まず、C または C++ でプログラミングしていますか。あなたが提示するコードは C のように見えますが、C++ のみが可能な try/catch ブロックについて話しています。

C++ では、 と を使用std::ostringstreamstd::stringます。他の解決策は単に間違っています。

C ではsnprintf、 の代わりに ,を使用する必要がありsprintfます。sprintf安全に使用することはほとんど不可能です。(たとえば、 には何文字ありますかLogFileCharName。)また、必要がない場合は動的割り当てを使用しないでください。(これは C++ にも当てはまります。表示するコードにはnewor delete(nor mallocor ) はありません。free

何がうまくいかないかについては、あなたが示すコードには少なくとも2つの問題が考えられます: でメモリを割り当てていますが 、(未定義の動作) でメモリをnew[]解放しており、を呼び出す前にfreeの長さをチェックしていないため、バッファの末尾を上書きしている可能性があります。LogFileCharNamesprintf

于 2013-05-13T07:45:59.420 に答える