【问题标题】:Assigning const std::string to std::string in c++在 C++ 中将 const std::string 分配给 std::string
【发布时间】:2020-11-04 18:51:33
【问题描述】:

我正在尝试将 const std::string 变量分配给 std::string 变量。但是遇到了一些与内存相关的错误。代码如下:

#include <iostream>
#include <string>

using namespace std;
std::string sender1;

std::string fun()
{
      const std::string sender = "hi";
       sender1.assign(sender);
      
}

int main()
{
    fun();
    cout<<sender1<<endl;
    return 0;   
}

【问题讨论】:

标签: c++ string stdstring


【解决方案1】:

您在fun 中忘记了return。如果您像这样更改该功能:

std::string fun()
{
    const std::string sender = "hi";
    sender1.assign(sender);
    return sender;
}

然后代码将编译并运行良好。

【讨论】:

    【解决方案2】:

    我终于得到了答案。

    我们需要在全局范围内声明一个 char *。然后使用 const_cast 我们可以将常量字符串转换为 char 并赋值。

    示例:在 .h 文件中:

    char * abc;
    

    在 .cc 文件中:

    func()
    {
     const std::string cde = "Hello";
     //now to use this constant string in another function,we use const cast and 
     //assign it to abc like below
     abc = const_cast <char *>(cde.c_str());
    }
    

    【讨论】:

    • abc 将指向在func() 末尾释放的数据,因此之后使用它是无效的,请参阅stackoverflow.com/questions/22330250/…
    • 这并不像你想象的那样。当函数返回时,字符串变量cde 将被销毁。然后指针abc 悬而未决。这段代码完全被破坏了。
    • 但它对我有用。它不会创建任何悬空指针。我没有简单地提出解决方案而不工作。
    • 很抱歉,变量cde是在函数中构造的,在函数返回时被销毁。指针指向被破坏对象的内容。它可能在您的简单测试中“有效”,但代码肯定会调用未定义的行为并且有一个可怕的错误。
    • 你不明白你在说什么。 c_str() 成员函数返回一个指向字符串内容的指针(字符串管理的内存)。字符串对象被销毁后,指针不再有效。它指向被破坏的对象内部或已释放回内存管理器的内存。指针分配不会使数据保持活动状态。这是一个悬空指针,语言标准说使用该指针是未定义的行为,并且您的程序格式错误。我不是在编造这个,你的代码是一个错误。
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多