gpt4 book ai didi

c++ - 字符数组重用

转载 作者:太空狗 更新时间:2023-10-29 23:26:31 27 4
gpt4 key购买 nike

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

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

函数原型(prototype)如下:

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 block 处理所有断言和错误。我该怎么做?

最佳答案

如果使用 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++ - 字符数组重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16516575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com