我该怎么做呢。
char* ToString(int num) {
char* str = new char[len(num)];
//conversion
return str;
}
通过调用它。
string someStr = ToString(someInt);
我应该释放someStr
吗?
我知道每当我使用delete
时,我总是需要new
。
如果我多次调用此函数,我会分配内存并让它们不使用它吗?
答案 0 :(得分:3)
你应该完全避免这种做法。要么返回std::unique_ptr
,要么直接处理std::string
。从您的代码中不清楚您到底要做什么,所以我无法提供具体的解决方案。
注意这个初始化:
string someStr = ToString(someInt);
只有在返回以null结尾的字符串时才能正常工作,但无论如何都会泄漏资源。
答案 1 :(得分:1)
每次拨打delete
时,您都需要拨打ToString
一次。您也无法按照问题提示的方式初始化带有已分配std::string
数组的char
- 泄漏返回的内存,而您的someStr
变量已将其复制。< / p>
最简单/最好的做法是将ToString
更改为返回std::string
。在这种情况下,当调用者的变量超出范围时,字符串使用的内存将被自动删除。
答案 2 :(得分:1)
我在valgrind下使用--leak-check=full
运行您的代码,报告num
内存泄漏的大小。
调用new/delete
,成对中的new [] /delete []
是保持内存循环的唯一方法。
我不确定你要做什么,如果你想将整数类型转换为字符串,C ++有几个选项:
// std::to_string(C++11) e.g:
{
std::string str = std::to_string(num)
}
// std::stringstream e.g:
{
std::string str;
std::stringstream ss;
ss << num;
ss >> str;
}
// boost::lexical_cast e.g:
{
std::string str = boost::lexical_cast<std::string>(num);
}
// itoa(c function)
{
char buf[MAX_INT_DIGITS]; // MAX_INT_DIGITS == 12 ("-2147483648\0")
itoa(num, buf, 10);
std::string str(buf);
}
答案 3 :(得分:0)
你是ToString
函数应该返回一个std :: string,如果你只是将值赋给std :: string。没理由在这里处理动态分配的内存。
答案 4 :(得分:0)
someStr
是副本。你已经泄漏了。您需要暂时保存返回指针的值,并在构造字符串后将其取消。这通常是智能指针的工作。
编辑: 否,
char* temp = strs; delete [] str; return temp;
将是未定义的。但是:
char* temp =ToString(someInt); string someStr(temp);delete []temp;
会奏效。但这只是为了让你理解这个想法。如果您返回unique_ptr,则可以为您完成此操作。而且我假设这是一种返回内存的一般性问题,之后必须是免费的,在unique_ptr
和shared_ptr
的情况下是一个解决方案。在这种特殊情况下,您只需创建一个字符串,修改它并简单地返回它。所有内存管理都将由字符串类为您完成。如果你真的只需要在字符串中分配“空格”,你可以这样做:
String Str; Str.reserve(len(num));