下面是我的示例代码。它只是一个示例,类似于我在我的应用程序中使用的代码。
#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/