在 C 中,从 std::string 函数返回 C 字符串文字是不明智的做法可能会导致不确定的行为。然而,一个常见的误解是这段代码应该会失败,尽管它在某些情况下似乎可以工作。
当“是我!!”传递给 myFunction() 时,C 字符串文字会隐式转换为 std::string 对象。返回的 std::string 对象指向其内部字符缓冲区,其中包含字符串文字的副本。在 std::string 上调用 c_str() 将返回指向此缓冲区的指针。
出现潜在问题是因为 std::string 对象的内部字符缓冲区未存储在静态内存中。一旦 myFunction() 函数返回,std::string 对象及其内部缓冲区就会被销毁。这意味着从 c_str() 获得的指针成为指向已释放内存的悬空指针。
但是,在某些实现和某些情况下,操作系统可能不会立即回收已释放 std::string 使用的内存。这称为记忆持久性。结果,操作系统错误地允许代码继续访问已释放的内存,给人一种代码工作正常的错觉。
需要强调的是,这种行为在 C 中未定义。语言标准没有定义在这种情况下会发生什么,并且不同的实现可能表现不同。依赖内存持久性是危险的,可能会在不同的上下文或不同的操作系统上导致意外错误。
因此,虽然示例代码在某些情况下似乎可以工作,但它仍然被认为是未定义的行为,应该被避免了。为了防止此类问题,建议从 std::string 函数返回字符串文字的副本,而不是直接指向其内部缓冲区的指针。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3