【问题标题】:Initialize const char * with out any memory leaks在没有任何内存泄漏的情况下初始化 const char *
【发布时间】:2013-01-23 21:10:14
【问题描述】:

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

#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”。但是删除确实很有必要。

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

提前致谢。

【问题讨论】:

  • 我不确定你在做什么,但为什么不改用std::string
  • 你能解释一下,为什么 + 2strlen(tempStr) + 2 中?
  • 你为什么要把myStr 当作const char*,然后在函数中强制转换常量?
  • 谢谢。我不能使用 std::string :(.

标签: c++ string char constants


【解决方案1】:

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

 const char * myStr = new char(STR_SIZE);

一个分配的字符被初始化为STR_SIZE,在这种情况下导致“字符溢出”。

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

 const char * myStr = new char[STR_SIZE];

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

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

您的代码sn-p中还有其他问题(将const char*交给一个函数然后修改ram,调用size参数时没有正确计算snprintf等),但这些与你的段错误问题。

【讨论】:

  • delete[] 不是delete
  • 谢谢阿基拉。这有帮助。 :)
【解决方案2】:

重新技术,而不是

const char * myStr = new char(STR_SIZE);

char const myStr[STR_SIZE] = "";

注意两者都有字符串不能修改的问题。

但你只问了分配/解除分配的问题。


但是,在语言技术之上的级别有很多错误。

这是原始代码,完整:

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;
}

以下是在 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() );
}

#define 从更自然的代码中消失了,但请注意,即使使用所有大写的宏名称,它也很容易导致不需要的文本替换。无论如何,大写大写都是令人眼花缭乱的(这就是为什么它是宏名称约定,而不是其他约定)。在 C++ 中,只需使用 const

【讨论】:

  • 好吧,有人可能会在你提议的代码中争论getString() 的接口:)
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 2021-12-19
  • 2020-04-30
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多