如何解决这段代码中是否存在悬空指针问题?
string str;
char *a=str.c_str();
此代码对我来说很好用,但我在其他每个地方都看到此代码
string str;
char *a=new char[str.length()];
strcpy(a,str.c_str());
我想知道哪个是正确的,为什么?
解决方法
假设str
的类型为std::string
,则两个代码都不正确。
char *a=str.c_str();
无效,因为c_str()
将返回const char*
并删除const
而不进行强制转换(通常为const_cast
)是无效的。
char *a=new char[str.length()];
strcpy(a,str.c_str());
无效,因为使用str.length()
时要求strcpy()
不计算终止的空字符,而分配终止的空字符是必需的。
此处发布的代码中没有悬空的指针问题,因为此处没有指针无效。
,两个代码段做不同的事情。
第一个将str
的指针值分配给新的c-tpye字符串,然后从const char*
(c_str()返回类型)隐式转换为{{1 }},这是错误的。如果要更改新字符串,将遇到错误。即使char*
返回了c_str()
,更改新字符串也会在char*
中进行更改。
另一方面,第二个从原始字符串创建一个新的c型字符串,将其逐字节复制到为新字符串分配的新内存中。
尽管您编写的代码行不正确,但是它不包含c类型字符串str
的终止空字符。为了解决这个问题,请为其分配1个额外的字节:
\0
将数据从第一个字符串复制到新的字符串后,对其进行更改不会导致原始char *a=new char[str.length()+1];
的更改。
可能。
考虑这个。
char const* get_string() {
string str{"Hello"};
return str.c_str();
}
该函数返回一个指向str
内部值的指针,该内部值在函数返回时超出范围。您有一个悬空的指针。未定义的行为。提防那些耗时的鼻猴。
现在考虑一下。
char const* get_string() {
string str{"Hello"};
char const* a = new char[str.length()+1];
strcpy(a,str.c_str());
return a;
}
该函数返回一个有效的指针,该指针指向有效的以N结尾的C样式字符串。没有悬空的指针。如果您忘记delete[]
,则会发生内存泄漏,但这不是您要的。
差异是对象生存期之一。注意范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。