调用std::string::assign(指针,0)时传递空或未初始化指针是否安全?
结论
你的写法属于未定义行为,不符合C++标准要求,并不安全,func1的分支判断才是必要的安全实现。
原因说明
- 你对标准前置条件的理解存在偏差。
std::string::assign(const charT* s, size_type n)要求s必须是指向至少n个元素的合法数组的有效指针,这个要求的前提是s本身是合法有效指针,nullptr和未初始化的野指针本身就不满足这个前提,和n的取值无关。 - C++标准中不存在“指向0个元素的数组的无效指针”这种说法,任何需要传入指针的接口,只要标准要求其指向某个对象/数组,就默认要求指针是合法有效的,不能是nullptr或者未初始化的值。
- 你测试的Demo可以正常运行只是当前编译器标准库的实现细节:主流STL实现处理
n=0的场景时不会读取s指向的内存,所以不会触发崩溃,但这不属于标准保证的行为,更换编译器、升级标准库版本都有可能导致代码出现不可预期的错误。
建议
如果需要代码具备可移植性、严格符合C++标准,必须保留n == 0的分支判断,不要依赖未定义行为的巧合表现。
内容的提问来源于stack exchange,提问作者Takatoshi Kondo
相关产品推荐
相关产品推荐

