首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

string 内存分配有关问题

2013-04-21 
string 内存分配问题刚转到C++,对C++的内存分配这块有些疑问,如下面代码所示,最后输出结果是0123456789101

string 内存分配问题
刚转到C++,对C++的内存分配这块有些疑问,如下面代码所示,最后输出结果是0123456789101112131415161718192021222324252627282930313233343536373839,请问string a存活多长时间,如果是getStr结束就结束的话为什么b的值不一起跟着清空。如果不是的话为什么没有及时释放,局部变量不是随着作用域结束而结束吗,这样的方法多了会不会有内存泄露呢?谢谢各位啊。

string getStr(int j){
string a;
for(int i=0;i<j;i++){
stringstream ss;
ss<<i;
a.append(ss.str());
}
return a;
}

int main() {
cout << "Hello World!!!" << endl; // prints Hello World!!!
string b=getStr(40);
cout<<b<<endl;
return 0;
} string 内存分配 生命周期
[解决办法]

引用:
string a在进入函数getStr()时构造,中间随着a.append()的调用不断申请(新)内存和释放(老)内存,函数getStr()退出时析构,释放内存,所以不会内存泄露.

但如果分配和释放内存的算法不好时,一个是效率低,还有一个是造成内存碎片化.


刚才说a在函数退出时析构,但要返回a给main()里的b,早先编译器的做法是临时构造一个string,拷贝a的内容,再释放a,等b拷贝好临时string的内容后再释放临时string,这样又多出两次分配/释放的动作.现代的编译器优化做的好,可以先不释放a,等b从a中拷贝好后再释放a.
[解决办法]
b的字符串值是从a拷贝来的。string类有拷贝构造函数,赋值操作符,以及析构函数,保证拷贝能正常完成。

热点排行