解析函数的问题(int 到 const char*)

Problem with a parsing function (int to const char*)

我需要创建一个解析函数,所以我这样写:

inline const char* parse(const int &arg)
{
     return std::to_string(arg).c_str();
}

看起来很合理 - 至少对我来说 - 但是当我尝试使用 std::cout 而不是整数值来查看此函数的值时,我得到了一些随机的 ascii 字符。

所以我尝试更改函数,结果是这样的:

inline const char* parse(const int &arg)
{
     return (new std::string(std::to_string(arg)))->c_str();
}

它按预期工作,但我想知道的是为什么第一个函数不能正常工作。

此外,还出现了一个次要问题(作为初学者可能是个愚蠢的问题)- 如果我创建 [=25],我是否应该 return 使用 std::move 函数的值=]动态? return std::move((new std::string(std::to_string(arg)))->c_str());

这会在第一种情况下调用未定义的行为。你创建了一个字符串对象,它的生命期在函数 returns 时结束,所以你 return 的指针也会在那个时候失效。

在第二种情况下,您将造成内存泄漏,因为字符串对象永远不会被删除。

你可以做的是复制字符串,即像这样:

return strdup(str.c_str());

但是调用者当然必须在完成后释放这个指针。所以主要问题是为什么你不能 return 字符串对象本身,这是安全的做法。

std::string parse(const int &arg)
{
    return std::to_string(arg);
}
inline const char* parse(const int &arg)
{
     return std::to_string(arg).c_str();
}

函数 parse 的新字符串是从 std::to_string(arg) 创建的,您可以使用 c_str 获得它的内部字符串。 c_str 当然 return 是 const char *,但现在这会产生问题。该字符串仍然是函数的本地字符串,但是在函数结束时它被销毁后,returned 究竟是什么? c_str 只有 return s 是指向内部字符串的指针,它不会创建副本。因此,您有一个悬空指针:它指向已释放的内存。

inline const char* parse(const int &arg)
{
     return (new std::string(std::to_string(arg)))->c_str();
}

new 在堆上创建一个字符串。在前面的例子中,在堆栈上创建了一个字符串,在函数结束后被释放,但堆不是这样工作的。您必须使用 delete 手动删除内存。这会产生另一个问题:您 return c_str 并且它可以工作,因为该字符串尚未被释放,但是您现在如何释放该字符串?事实上,你不能,因为没有指针指向它,所以你造成了内存泄漏。

你return一个const char *的原因是:

I need to return const char* because the function is meant to only be used as an argument in another function (the argument's type is const char*).

但您仍然可以 return std::string 并在 returned 值上使用 c_strputs 的示例:

#include <cstdio>
#include <string>

std::string parse(const int &arg)
{
    return std::to_string(arg);
}

int main()
{
    std::puts(parse(42).c_str());
    return 0;
}