消息关闭
    暂无新消息!

string和vector混用的问题

问题作者 : 升木2017-06-22发布
两个问题,直接上代码:
vector<string> GetWords()
{
vector<string> test;
string a = "Hello";
test.push_back(a);
string b = "Baby";
test.push_back(b);
return test;  //这里返回后,变量a、b是局部的,应该会释放。那vector中的会不会也被释放?
}
int main()
{
vector<string> t = GetWords();    //这里调用vector拷贝构造,是浅拷贝,有问没有问题?
}

7个回答

︿ 2
理解讨论之前请先学会如何观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
︿ 1
1、函数中的是会释放的,但函数返回时会进行复制,所以返回值得到的是另一个vector对象,代码没问题

2、主函数是深拷贝,vector类中已经实现好了,同样没有问题
︿ 1
a,b会被释放,但是vector中是它们的副本,push之后跟a,b没有什么关联了的
test也会被释放,但是main中返回的也是test的副本,之后也没啥关联(编译器可能进行了优化,但是不影响程序的正确性)
︿ 0
常见的返回这种非基础类型的东西的做法是使用引用形参
 void GetWords(vector<string> & vec)
元素加入到vector之后,就无需关心生命周期问题了,因为vector会复制一份在里边