STL string的内存释放

本文详细阐述了C++中string对象的内存管理问题,包括内存泄露现象及其解决方法,以及如何直接操作string的内部数据缓冲区。通过实例演示了如何使用swap函数和data()函数配合const_cast实现内存释放与数据直接操作,同时提供了vector内存管理的最佳实践,强调了Clear函数与内存释放的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



随着用string越来越多,有的时候你会发现string的内存管理的问题,存在内存暂时泄露的问题。这个内存泄露与我们常规说的内存泄露问题不一样。它部是真的内存泄露,在程序结束的时候,内存还是会释放掉的,但是在程序的运行过程中,内存被string对象占用着。比如你有个string对象保存了一个比较大的网页,用完了之后,你想通过clear来回收这个对象的内存,你这样是做不到的。因为string的clear并不会真正回收string对象分配内存。那要怎么做才能做到呢?

用swap函数,你申请一个临时的string对象,然后用这个临时string对象与要释放内存的string对象交换内存,就能达到释放内存的作用。比如s是我们要释放的内存,那么string().swap(s);就能释放掉s对象的内存。

有的时候,你想直接操作stirng对象的数据存储空间,那怎么办呢?我们知道可用data()函数获取stirng对象的数据存储空间的指针,虽然该指针是const,但这难不倒我们,因为我们可以const_cast。对这方面的问题,网上基本没有什么资料,经过我的摸索,正确直接操作string data buffer的方法是:

  1. 先调用resize函数,将data buffer开到一定的大小,具体多大由需求多定。注意这里不应该用reserve函数来搞,因为reserve函数只是分配对应的空间,并没有改变stirng的length。
  2. 调用data()函数,并const_cast成char *。
  3. 对转换后得到的char *进行操作,注意不能超过第一步resize的大小,否则可能有越界的危险。
  4. 调用resize函数将string的长度调整为实际的长度。实际的长度应该由上一步实际的操作来决定。

假设我们第一步用的是reserve函数,会有什么问题呢?首先可以明确的是,不会有越界的危险。但是,如果你这么做的话,往往不会得到正确的结果。为什么呢?因为第4步进行resize的时候,你之前对char*的操作,可能被重置为null char。



一般,如果vector中存放是的指针,那么必须先遍历一遍,释放指针所指向的内存。(如果vector的元素是内置类型,那么就没有必要做这一步)
然后在释放vector中各元素所占内存,这时候可以用swap方法。
注意,Clear函数只是清除元素,并不释放内存。

std::vector splitRSACipher(const char *configStr)


{


std::string needToDecrypt(configStr);


std::vector vs;


//分割json字符串


int vcLen = 0;


int priPos = 2;


int aftPos = 0;




while((aftPos = needToDecrypt.find( "\",\"", priPos )) != std::string::npos)


{


std::string str = needToDecrypt.substr(priPos, aftPos - priPos);


vs.push_back(str);


priPos = aftPos+3;


}




if((aftPos = needToDecrypt.find( "\"]", priPos )) != std::string::npos)


{


std::string str = needToDecrypt.substr(priPos, aftPos- priPos);


vs.push_back(str);


}


else


{


vs.clear();


std::vector().swap(vs);


}




return vs;


}




而string的话,分情况:

string
Password;

这样定义的不用释放
除了变量的作用范围他自动就释放掉了

这样的string
你不用去释放,当这个string对象离开其作用域的时候,系统会自动调用其
析构函数去释放。




如果你要使用delete,那么请记住,一个new对应一个delete。
string*
p=new string("strings");

完成工作后要使用delete清除
delete
p;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值