c++ string类型内存分配

#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
",&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
",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
",&"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()的地址不发生变化。

经验分享 程序员 微信小程序 职场和发展