关于vector作为函数的返回值

廖汀花溆 2014-01-18 05:24:25
vector<object> fun()
{
vector<object> vect1;
object *p1=new object();
object *p2=new object();
vect1.push_back(*p1);
vect1.push_back(*p2);
return vect1;
}
main()
{
vector<object> vect=fun();
}

//请问此时main调用fun后,之前给分配的那块堆中内存释放了吗? 因为在函数内部需要返回。我无法手动
调用delete 去删除那两个vector中的两个元素。又怕内存会泄露,请问我应该怎么办?
...全文
1318 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
勉励前行 2014-01-25
  • 打赏
  • 举报
回复
首先得明确vector数组中放的是指针还是对象实例。你上面的代码,vector中放的是对象实例。 vector析构时会自动析构其中的对象实例(调用每一个实例的析构函数)。 除非对象很简单,一般不应该在函数中直接返回vector,因为那会造成vector中的每一个对象都产生多余的一次构造与析构。C++11新支持的移转构造与右值引用语法可以解决该问题,不过那也得精心设计的类才这样做。一些情况,直接返回复杂类,很有帮助,例如对于矩阵类,重载操作符后,如果直接返回类,确实语法上直观得多,C++11就很有用。 你上面的代码, object *p1=new object(); object *p2=new object(); vect1.push_back(*p1); vect1.push_back(*p2); return vect1; //这里放入vector中的是对象的实例,这里会调用拷贝构造函数,重新在vector中构造一个实例,vector中的实例并非new 出来的p1,所以如果函数中不调用delete,就没机会再delete了。 当重新配置内存时,会产生一次析构与拷贝构造调用,vector的效率因此而打折扣,对于复杂的对象,建议还是在vector中存放指针。
廖汀花溆 2014-01-25
  • 打赏
  • 举报
回复
引用 9 楼 tnijerry 的回复:
[quote=引用 7 楼 shiqq1989x 的回复:] [quote=引用 4 楼 tnijerry 的回复:] 用vector<数据类型>().swap(vector变量名)释放vector所占的内存;
?我这里不需要释放啊,传进来的参数是引用,任然还是现在需要使用,而且,即使要释放也得用delete循环删除吧[/quote] 哦,明白你的意思了。你这个真够麻烦的,堆中内存应该没有释放,不放心的话用工具检测一下内存是否有泄漏。妖哥说的很有道理,严重不建议用复杂数据类型做返回值![/quote] 我后来转换为这种方法了 [code=c] void fun(vector<object>& vect1) { object *p1=new object(); object *p2=new object(); vect1.push_back(*p1); vect1.push_back(*p2); return vect1; } main() { vector<object> vect; fun(vect); //如果需要释放vector中的内存,可以这释放 //..... }
ken_scott 2014-01-24
  • 打赏
  • 举报
回复

vector<object> fun()
{
    vector<object> vect1;
    object *p1=new object(); 
    object *p2=new object();
    vect1.push_back(*p1); // 传的是对象 (const object &), 不是指针
    vect1.push_back(*p2);
    delete p1; // 如果不在此处释放, p1指向的资源永远也没办法被是否 (程序不结束的话)
    delete p2;
    return vect1; 
}
  • 打赏
  • 举报
回复
引用 8 楼 shiqq1989x 的回复:
[quote=引用 5 楼 akirya 的回复:] 没看到delete 所以你得在vector<object> vect=fun();后面写个循环delete vector2个元素
之前那样做法是需要delete,但是delete之后再返回,容器中存的不就是空的了?[/quote] new出来的元素自然是用完了再delete 在函数内delete的话,返回vector自然是错误的。
繁华落尽空 2014-01-24
  • 打赏
  • 举报
回复
引用 7 楼 shiqq1989x 的回复:
[quote=引用 4 楼 tnijerry 的回复:] 用vector<数据类型>().swap(vector变量名)释放vector所占的内存;
?我这里不需要释放啊,传进来的参数是引用,任然还是现在需要使用,而且,即使要释放也得用delete循环删除吧[/quote] 哦,明白你的意思了。你这个真够麻烦的,堆中内存应该没有释放,不放心的话用工具检测一下内存是否有泄漏。妖哥说的很有道理,严重不建议用复杂数据类型做返回值!
廖汀花溆 2014-01-24
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
没看到delete 所以你得在vector<object> vect=fun();后面写个循环delete vector2个元素
之前那样做法是需要delete,但是delete之后再返回,容器中存的不就是空的了?
廖汀花溆 2014-01-24
  • 打赏
  • 举报
回复
引用 4 楼 tnijerry 的回复:
用vector<数据类型>().swap(vector变量名)释放vector所占的内存;
?我这里不需要释放啊,传进来的参数是引用,任然还是现在需要使用,而且,即使要释放也得用delete循环删除吧
繁华落尽空 2014-01-22
  • 打赏
  • 举报
回复
用vector<数据类型>().swap(vector变量名)释放vector所占的内存;
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
我是严重不建议用复杂数据类型做返回值的,用参数才是王道。
是基于什么理由呢?
  • 打赏
  • 举报
回复
没看到delete 所以你得在vector<object> vect=fun();后面写个循环delete vector2个元素
廖汀花溆 2014-01-20
  • 打赏
  • 举报
回复
引用 2 楼 ccrun 的回复:
我是严重不建议用复杂数据类型做返回值的,用参数才是王道。
传递vector的引用作为参数了,这个确实很好,谢谢了! 因为以前都是写C,想到的一直返回普通变量还是指针问题,这两种都不可取,还是传引用比较好
ccrun.com 2014-01-18
  • 打赏
  • 举报
回复
我是严重不建议用复杂数据类型做返回值的,用参数才是王道。
sololie 2014-01-18
  • 打赏
  • 举报
回复

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧