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\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()的地址不发生变化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值