理解 C 函数中的隐式返回
在 C 中,当将字符串文字传递给函数时,编译器会隐式地将其转换为std::string 对象。但是,在下面的示例中,我们从 std::string 函数返回 C 样式字符串文字:
std::string myFunction() {
return "it's me!!";
}
这引起了一个问题,因为这里隐式调用的 std::string 构造函数创建了字符串文字的副本。当函数返回时,这个副本应该被释放,留下一个悬空指针。
调用 c_str() 时会发生什么?
但是,调用 myFunction()。 c_str() 返回指向 std::string 对象中存储的数据的指针。即使在 std::string 对象被释放之后,该指针也指向保存字符串文字的同一内存。
为什么这有效(排序)
The该代码似乎可以工作的原因是操作系统内存管理的一个怪癖。当内存块被释放时,操作系统并不总是清除其内容。这意味着字符串文字的数据仍然存在于内存中,即使它在技术上无法访问。
未定义的行为和运气
需要注意的是,此行为是未定义的根据C标准。这意味着任何事情都可能发生,包括崩溃或不正确的结果。在某些情况下,它的工作原理不是因为正确的 C 实践,而是因为操作系统的实现细节。
因此,避免依赖此行为并始终确保在 C 代码中正确分配和释放数据至关重要.
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3