字符数组重用
Character array reuse
我正在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::ostringstream
和 std::string
。 任何其他解决方案根本不正确。
在 C 中,您应该使用 snprintf
,而不是 sprintf
。 是的几乎不可能安全地使用sprintf
。 (多少个字符例如,在LogFileCharName
中。 并且不要使用动态在不需要的时候分配。 (这适用于C++井;不应有new
或delete
(也不应malloc
或 free
( 在您显示的代码中。
至于出了什么问题,至少有两种可能您显示的代码中的问题:您正在分配内存 new[]
,但用free
释放它(未定义的行为(,以及您之前没有检查LogFileCharName
的长度调用sprintf
,因此您可能会覆盖缓冲区。
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符