初始化const char*没有任何内存泄漏

Jab*_*bez 1 c++ string const char

以下是我的示例代码.它只是一个样本,类似于我在我的应用程序中使用的代码.

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用此代码,我会收到异常.我认为问题在于删除"myStr".但删除是非常必要的.

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

提前致谢.

aki*_*ira 9

你不是分配一个字符数组,而是用这一行分配一个字符:

 const char * myStr = new char(STR_SIZE);
Run Code Online (Sandbox Code Playgroud)

并且一个已分配的char用值初始化,STR_SIZE在这种情况下导致"char溢出".

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

 const char * myStr = new char[STR_SIZE];
Run Code Online (Sandbox Code Playgroud)

(注意矩形[]).你必须使用delete[]运算符释放这样分配的内存块.

个人注意事项:您上面编写的代码(手动分配字符串等)具有良好的教育意义; 你会做很多这样的错误,从而了解C/C++的内部工作原理.对于您不希望的生产代码,对于您想要的生产代码std::string或其他字符串容器,以避免重复与字符串相关的错误.一般来说,你不是那个成功重塑字符串库如何工作的人.其他容器类型也是如此,例如dynamic-growable-arrays(std::vector)或字典类型等等.但是对于你的代码上面的教育摆弄是一个很好的目的.

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

  • 并且`delete []`不是`delete`. (3认同)

Che*_*Alf 5

重新技术,而不是

const char * myStr = new char(STR_SIZE);
Run Code Online (Sandbox Code Playgroud)

char const myStr[STR_SIZE] = "";
Run Code Online (Sandbox Code Playgroud)

请注意,两者都存在无法修改字符串的问题。

但是您仅询问分配/取消分配问题。


但是,在语言技术水平以上的水平上有很多错误。

这是原始代码,完整:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是在C ++级别执行此操作的方法:

#include <string>           // std::string
#include <sstream>          // std::ostringstream
using namespace std;

void someThirdPartyFunc( char const* ) {}

string getString( int const num )
{
    ostringstream stream;
    stream  << "MyTempString=" << num;
    return stream.str();
}

int main()
{
  someThirdPartyFunc( getString( 1 ).c_str() );
}
Run Code Online (Sandbox Code Playgroud)

#define更自然的代码消失了,但要注意,它可以很容易导致不想要的文本替换,即使全部使用大写宏名。无论如何,喊大写都是一件令人讨厌的事情(这就是为什么它是宏名称约定而不是其他约定的原因)。在C ++中,只需使用const代替。