0

How do I do this thing.

char* ToString(int num) {

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

    //conversion

    return str;

}

And by calling this.

string someStr = ToString(someInt);

Should I free the someStr here?

I know I always need to delete whenever I use new.

And what if I call this function multiple times, do I allocate memory and just leaving them behind not using it?

4

5 回答 5

3

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

请注意,此初始化:

string someStr = ToString(someInt);

仅当您返回一个以空字符结尾的字符串时才能正常工作,但无论如何它都会泄漏资源。

请参阅此相关帖子

于 2013-02-05T12:00:12.197 回答
1

每次调用 都需要调用delete一次ToString。您也不能按照您的问题提示的方式std::string使用分配的char数组初始化 a - 这会泄漏返回的内存,而您的someStr变量已经复制了它。

最简单/最简洁的做法是改为ToString返回std::string。在这种情况下,当调用者的变量超出范围时,字符串使用的内存将被自动删除。

于 2013-02-05T12:00:02.680 回答
1

我在 valgrind 下运行了你的代码--leak-check=full,它报告num了内存泄漏的大小。

成对调用new/deletenew [] /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);
}
于 2013-02-05T12:08:32.817 回答
0

你的ToString函数应该返回一个std::string,如果你只是将值分配给一个std::string。没有理由在这里处理动态分配的内存。

于 2013-02-05T11:59:56.813 回答
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));
于 2013-02-05T12:00:47.170 回答