#include <iostream>
#include <cstdlib>
#include <string>
using std::string;
using std::cout;
using std::endl;
//重写string类的new操作符,添加一个可以识别malloc操作的输出
void* operator new(std::size_t n){
cout<<"分配"<<n<<"字节"<<endl;
return malloc(n);
}
void operator delete(void *p) throw(){
free(p);
}
int main(int argc, char const *argv[])
{
string s="AA"; //直接初始化
printf("字符串字面量:%p\n",&s);
cout<<"初始化时的状态:"<<endl;
cout<<"sizeof:"<<sizeof(s)<<endl;
cout<<"size:"<<s.size()<<endl;
cout<<"分配的内存尺寸(capacity):"<<s.capacity()<<endl;
for(size_t i=6;i<50;++i){
s.push_back('+');
cout<<"分配的内存尺寸(capacity):"<<s.capacity()<<endl;
printf("地址:%p\n",s.c_str());
cout<<i<<":"<<s<<endl;
}
cout<<"push_back('+')之后的内存尺寸是"<<endl;
cout<<"sizeof:"<<sizeof(s)<<endl;
cout<<"size:"<<s.size()<<endl;
cout<<"分配的内存尺寸(capacity):"<<s.capacity()<<endl;
printf("字符串字面量:%p\n",&"AAAA AAAA AAAA");
return 0;
}
注意当s的长度达到16时,开始用new进行内存的分配;即s长度小于16分配在栈中,s长度大于等于16分配在堆中。
同时内存分配最少为15,比如s=“A”时,s.capacity()为15。
当s="AAAA AAAA AAAA A"时,s.capacity()为16。
当s="AAAA AAAA AAAA AAA"时,s.capacity()为18。
sizeof(s)永远为32。
当s.push_back()到超过s.capacity()时,s.capacity()每次增长为原来的两倍。同时s.c_str()的地址不发生变化。