字符数组重用

Character array reuse

本文关键字:数组 字符      更新时间:2023-10-16

我正在Visual Studio 2010中编写一个Win32控制台应用程序。

考虑一个将两个char*作为参数的函数。

以下是函数的原型:

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;

我哪里出错了?

还有一件事是我想使用 try-catch 块处理所有断言和错误。我该怎么做?

如果使用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*,所以如果函数修改参数,将字符串文本传递给函数将导致未定义的行为。

首先,你是用 C 还是用 C++ 编程。 您提供的代码看起来像C,但你说的是try/catch块,它只能要C++。

在C++中,使用 std::ostringstreamstd::string 。 任何其他解决方案根本不正确。

在 C 中,您应该使用 snprintf ,而不是 sprintf 。 是的几乎不可能安全地使用sprintf。 (多少个字符例如,在LogFileCharName中。 并且不要使用动态在不需要的时候分配。 (这适用于C++井;不应有newdelete(也不应mallocfree ( 在您显示的代码中。

至于出了什么问题,至少有两种可能您显示的代码中的问题:您正在分配内存 new[] ,但用free释放它(未定义的行为(,以及您之前没有检查LogFileCharName的长度调用sprintf,因此您可能会覆盖缓冲区。