我正在Visual Studio 2010中编写Win32控制台应用程序.
考虑一个将两个char*作为参数的函数.
以下是功能原型:
void WriteApplicationFile(char *mappname,char* MessageString)
{
//Do some File related stuffs.
}
Run Code Online (Sandbox Code Playgroud)
现在以下调用完美地运行:
WriteApplicationFile("FirstOne", "Append Me");
WriteApplicationFile("FirstOne", "Append Another");
Run Code Online (Sandbox Code Playgroud)
但是如果我用一些字符数组的东西尝试相同的东西,这将给我断言,并把我扔到汇编.
以下代码无效:
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;
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
还有一件事是我想用try-catch块处理所有断言和错误.我该怎么做?
hmj*_*mjd 13
如果使用new[]你必须使用delete[],而不是free()或delete.更换:
free(LocalBuffer);
Run Code Online (Sandbox Code Playgroud)
有:
delete[] LocalBuffer;
Run Code Online (Sandbox Code Playgroud)
似乎没有理由动态分配内存.缓冲区的大小是编译时常量,不是很大(没有堆栈溢出),并且缓冲区似乎不需要超出分配范围.
因为这是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());
Run Code Online (Sandbox Code Playgroud)
如果需要访问c风格的字符串,请使用std::string::c_str().
此外,参数类型WriteApplicationFile()是char*,而不是const char*,因此如果函数修改参数,则将字符串文字传递给函数将导致未定义的行为.