从const char*构造std::string且零内存分配相关问题
C++ std::string 常见问题解答
1. 声明std::string cpp{};时会调用new/malloc吗?
不会。目前主流编译器的std::string都实现了短字符串优化(SSO),空字符串或者长度较小的字符串会直接存在std::string对象自身的内部缓冲区中,完全不需要向堆申请内存,自然不会调用new或malloc。你可以查看编译器的具体实现代码,比如GCC的basic_string里就内置了一块字符数组,空字符串直接复用这块区域即可。
2. 已有const char* c,能不能不额外分配内存就把c的内容转移到std::string里?
不行,核心原因有两点:
- 其一,
const char*指向的内存是只读的,而std::string需要掌控属于自己的可修改内存空间(哪怕是const std::string,也必须持有自身的内存副本); - 其二,
std::string无法接管外部const char*的内存——它不清楚这块内存的分配方式(是静态字符串字面量、malloc还是new分配的),后续也无法正确释放这块内存,因此必须重新分配内存并拷贝c的内容。 - 别尝试用强制类型转换修改
std::string内部指针这类操作,这属于未定义行为,绝对不能使用。
内容的提问来源于stack exchange,提问作者SpeakX
相关产品推荐
相关产品推荐

