c++ - 在没有任何内存泄漏的情况下初始化 const char *

标签 c++ string char constants

下面是我的示例代码。它只是一个示例,类似于我在我的应用程序中使用的代码。

#define STR_SIZE 32

void someThirdPartyFunc(const char* someStr);

void getString(int Num, const char* myStr)
{
  char tempStr[] = "MyTempString=";
  int size = strlen(tempStr) + 2;
  snprintf((char*)myStr, size, "%s%d", tempStr, Num);
}

int main()
{
  const char * myStr = new char(STR_SIZE);
  getString(1, myStr); // get the formated string by sending the number
  someThirdPartyFunc(myStr); // send the string to the thirdpartyFunction
  delete myStr;

  return 0;
}

如果我使用这段代码,我会遇到异常。我认为问题在于删除“myStr”。但是delete确实很有必要。

有没有其他方法可以格式化 getString 中的字符串并将其发送到 ThirdPartyFunc?

提前致谢。

最佳答案

你分配的不是一个字符数组,而是一个字符:

 const char * myStr = new char(STR_SIZE);

并且一个分配的 char 被初始化为 STR_SIZE 的值,在这种情况下导致“char overflow”。

如果你想要一个大小为STR_SIZE的数组:

 const char * myStr = new char[STR_SIZE];

(注意矩形 [ ])。您必须使用 delete[] 运算符释放此类分配的内存块。

个人说明:您上面编写的代码(手动分配字符串等)具有很好的教育意义;你会犯很多这样的错误,从而了解 C/C++ 的内部工作原理。对于生产代码,您不希望这样,对于生产代码,您需要 std::string 或其他字符串容器,以避免重复与字符串相关的错误。通常,您不是成功 reshape 字符串库工作方式的人。对于动态可增长数组 (std::vector) 或字典类型等其他容器类型也是如此。但是对于上面的代码的教育摆弄是一个很好的目的。

您的代码片段中还有其他问题(将 const char* 交给函数,然后修改 ram,调用 时未正确计算 size 参数>snprintf 等),但这些与您的段错误问题无关。

关于c++ - 在没有任何内存泄漏的情况下初始化 const char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14766864/

相关文章:

c - 格式化字符串中的内存泄漏,正确的空终止

c++ - 无法将 libpcrecpp 链接到 MinGW

c++ - 从终端编译框架(cppunit、boost、++)以使用 Xcode 4.6

c++ - Windows XP 上的 GDI+ 问题

python - 按特定顺序格式化字符串

将字符视为数字,进行比较

c++ - 使用 vector 解决 Josephus 问题

Java-使用 BufferedReader 时将 String 转换为 int

c - 如何从字符串 H :M:S in C 中获取时间

C - I/O - 用于打印句子结构的字符数组