You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:39:02