c++:std::string,std::function,std::vector隐式申请动态内存 📅 2026/7/13 15:40:39 1std::string①如下代码声明一个局部std::string变量s打印出来s的capaciy为15也就是说默认情况下std::string能保存15个字符不需要动态申请内存对malloc设置断点没有打断说明没有动态申请内存。②向s赋值一个长度为15的字符串不会申请动态内存。③向s赋值一个长度为16的字符串会申请动态内存会调用malloc。#include iostream #include string #include unistd.h int main() { sleep(10); std::string s; std::cout s.capacity s.capacity() std::endl; std::cout before test 15 std::endl; sleep(10); s helloworldhello; sleep(10); std::cout before test 16 std::endl; s helloworldhello1; return 0; }2std::function如下代码两个lambda表达式lambda1的size为16lambda2的为24lambda表达式就是一个匿名对象对象大小由捕获列表确定考虑内存对齐。使用lambda1对f进行赋值不会调用malloc使用lambda2进行赋值会调用malloc。#include iostream #include string #include vector #include unistd.h #include functional int main() { std::functionvoid() f; long ld1 100; long ld2 200; char ld3 3; std::cout f.size sizeof(f) std::endl; sleep(10); auto lambda1 [ld1,ld2]() {std::cout in lambda ld1 ld2 std::endl;}; std::cout sizeof(lambda1) sizeof(lambda1) std::endl; f lambda1; f(); auto lambda2 [ld1,ld2,ld3]() {std::cout in lambda ld1 ld2 ld3 std::endl;}; std::cout sizeof(lambda2) sizeof(lambda2) std::endl; f lambda2; f(); return 0; }3std::vectorstd::vector的默认容量为0随着元素的增加逐渐申请内存。新申请内存时也会把旧内存释放。#include iostream #include string #include vector #include unistd.h int main() { sleep(10); std::vectorint d1; std::cout 1 vector capacity d1.capacity() std::endl; d1.push_back(1); std::cout 2 vector capacity d1.capacity() std::endl; d1.push_back(2); std::cout 3 vector capacity d1.capacity() std::endl; d1.push_back(3); std::cout 4 vector capacity d1.capacity() std::endl; return 0; }