字符数组重用

San*_*ade 2 c c++ winapi

我正在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*,因此如果函数修改参数,则将字符串文字传递给函数将导致未定义的行为.

  • @SantoshDhanawade,1)找出为什么`std ::`被禁止以及为什么你的生活变得更加困难.2)`new char []`后跟`delete []`将不是断言的原因.删除部分代码,直到错误消失,然后重新引入代码以找到错误的来源或发布更多代码供人们评论. (3认同)
  • 这应该不会造成问题,因为您已经解决了免费/删除问题。既然是这样,很可能你在其他地方搞砸了你的记忆,直到这里才看到它。双重免费在调试中花费了我好几天。基本上,一旦你搞砸了你的内存管理,之后的一切都必须被认为是假的。当你搞砸了你的记忆时,并不总是有任何方法可以告诉你。 (2认同)