返回已分配的局部变量

时间:2013-02-05 11:57:44

标签: c++ visual-c++ memory c++11

我该怎么做呢。

char* ToString(int num) {

    char* str = new char[len(num)];

    //conversion

    return str;

}

通过调用它。

string someStr = ToString(someInt);

我应该释放someStr吗?

我知道每当我使用delete时,我总是需要new

如果我多次调用此函数,我会分配内存并让它们不使用它吗?

5 个答案:

答案 0 :(得分:3)

你应该完全避免这种做法。要么返回std::unique_ptr,要么直接处理std::string。从您的代码中不清楚您到底要做什么,所以我无法提供具体的解决方案。

注意这个初始化:

string someStr = ToString(someInt);

只有在返回以null结尾的字符串时才能正常工作,但无论如何都会泄漏资源。

请参阅this related post

答案 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_ptrshared_ptr的情况下是一个解决方案。在这种特殊情况下,您只需创建一个字符串,修改它并简单地返回它。所有内存管理都将由字符串类为您完成。如果你真的只需要在字符串中分配“空格”,你可以这样做:

String Str; Str.reserve(len(num));