smart_210_
zou_zhen
采纳率78.9%
2017-05-14 03:12 阅读 2.6k

C++局部对象作为返回值的问题

请教大神如下问题:根据C++的内存管理可以知道,在函数里面创建的对象是作为局部变量的,那么这个对象就会在
函数结束的时候被回收。但是如果将这个对象作为返回值返回出去呢?一样会被回收吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • lixiaogang_theanswer 君子黎 2017-05-14 03:40
     class People;
     People func()
     {
         People p;
             return p;   
     }
     //楼主的描述是这样的吗,如果将这个对象p作为返回值返回出去一样会被析构,这里会产生一个叫做“匿名对象”,发生一个拷贝操作,
     把对象p的值给匿名对象一份,然后对象p本身被析构了;对于匿名对象的生命周期,这要看外面怎么去接这个匿名对象
    
    点赞 评论 复制链接分享
  • qq_34384524 ????3 2017-05-14 03:47

    建议楼主去看一下函数调用栈明白临时变量是存放在栈上的

    点赞 评论 复制链接分享
  • lzl569029783 stonerebel 2017-05-14 04:09

    对象作为返回值,函数结束前会产生数据拷贝,返回后就已经不是原来地址上的对象了,只是对象成员变量值是相同的
    也正是基于上面的原因,返回类型如果是引用的话,不用返回局部变量,因为引用不产生拷贝

    点赞 评论 复制链接分享
  • what951006 小乌龟在大乌龟背上 2017-05-14 04:11

    这条规则是死的,对象一样会回收,C++11虽有移动构造函数之说,但还是会调用析构。

    点赞 评论 复制链接分享
  • qq_35234123 x9300 2017-05-14 11:30

    好深奥的问题啊,感觉应该会回收吧,返回的应该是副本吧

    点赞 评论 复制链接分享
  • u010136832 小邓在路上 2017-05-18 02:52

    函数的局部对象在当前函数被调用的时候创建,存储在栈区,在函数结束以后就会被释放,如果存在返回值,那么当前对象也会被释放,只不过在被释放前
    做了一次拷贝,拷贝到接受该返回值的另外一个对象上面,所以函数的入参和返回值其实都进行的是拷贝操作,新的对象被赋值,旧的的对象被回收

    点赞 评论 复制链接分享
  • qq546264428 Vivikki_1 2018-11-27 01:38

    分两种情况,1.声明一个变量来接受函数返回的局部变量时,我观察到的现象居然是函数返回的对象并没有被析构,直接就给到了声明的接收变量上,以为是走了移动语义,实际调试代码发现并没有。
    2.用另一个创建好了的对象来接收,会根据复制拷贝或者移动复制函数规则来进行。

    点赞 评论 复制链接分享

相关推荐