从内部使用静态std :: string的函数返回const char *是否安全?

我正在查看以下代码(简化了),并问自己使用此returnMsg功能的安全性:

#include <iostream>

using namespace std;

const char *returnMsg(const char *msg)
{
    static std::string message;

    message = msg;

    return message.c_str();
}

int main(int argc, char *argv[])
{
    const char *msg1 = returnMsg("Hello world");
    printf("msg1 = %p\n", msg1);
    cout << msg1 << endl;

    const char *msg2 = returnMsg("Good bye");
    printf("msg2 = %p\n", msg2);
    cout << msg2 << endl;

    cout << msg1 << endl;

    return 0;
}

输出为:

msg1 = 0x23a6028
Hello world
msg2 = 0x23a6028
Good bye
Good bye

msg2两次写入,这是我期望的,因为静态消息变量在程序有效期内仍保留在内存中,并且没有内存重新分配,因此在msg1address处写入的内容将由的新内容替换msg2

但是,如果的大小msg2较大,则std::string message变量内部将进行内部重新分配,并且输出为:

msg1 = 0x1cc6028
Hello world
msg2 = 0x1cc6058
Good bye looooooooooooooooooooooooooooooooooooooooong
Hello world

但是我猜不能保证msg1地址将来不会被重用,因此对msg1内容的新访问可能最终会显示出不同且不一致的内容。

是否需要以不同的方式编写此函数才能使其不受上面显示的限制使用?

埃雷里卡

从内部使用静态std :: string的函数返回const char *是否安全?

是的,那很安全。

但是,在指针无效后再使用该指针是不安全的,这就是所示程序的作用。如果重新分配了指针,则在连续调用该函数时,该指针会使该指针无效。因此,指针仅在下一次调用该函数之前才是安全的(这将导致重新分配)。

是否需要以不同的方式编写此函数才能使其不受上面显示的限制使用?

该功能具有所描述的限制,因此当然必须以不同的方式编写以不具有那些限制。

该方法的核心问题是,您只有一个静态字符串,但是要存储多个字符串,同时又不丢弃任何较早的字符串。因此,似乎您需要一堆静态字符串:

const char *returnMsg(const char *msg)
{
    static std::forward_list<std::string> messages;
    messages.emplace_front(msg);
    return messages.front().c_str();
}

尽管这可以按您期望的那样工作,但它很愚蠢。考虑您是否真的要在其余的执行中存储所有字符串。如果不是,则静态存储不是解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

返回const std :: string的方法是否应该返回const std :: string_view?

如何将std :: string转换为const char *或char *?

从“ std :: string”到“ const char *”的转换函数不存在

std :: string和const char *

如何干净使用:const char *和std :: string?

静态常量的std :: string vs char数组

如何使用inst const char *作为std :: string内容

返回填充在函数内部的const char *向量是否明确定义为行为

返回从函数分配了字符串文字的const char *是否安全?

在被调用函数内部更改函数指针(std :: function)是否安全?

std :: string的串联引用是否安全?

将对临时/匿名lambda的const引用传递到std :: thread构造函数中是否安全?

将const char *文字用作std :: map键是否安全?

将char *转换为const unsigned char *是否安全?

为类成员返回const std :: string&vs const char *

从类方法返回“ const char *”作为std :: string&

C ++:使用委托构造函数时选择`const char *`vs`std :: string`

为const char *定义std :: begin是否合法?

将char数组传递给需要const std :: string参考的函数

从函数返回的std :: string上直接调用c_str()是否安全?

std :: to_string存储在const char *中

constexpr静态std :: array <const char *,5>无法使用MSVC2013进行编译

使用c ++ 20 Concept检查函数是否返回const值

使用<string>中的Insert函数时,从char到const char的转换无效

std :: string.assign(const char *)或op =(带有const char *)会创建char *的副本吗?

按值返回std :: string是否安全?

String.getBytes 是否被安全使用?

检查 std::vector<const char *> 是否包含作为 const char * 给出的字符序列

在 C/C++ 中比较 const char* 和 == 是否安全?