c ++中返回对象的内存分配

时间:2018-03-16 12:33:43

标签: c++ object memory-management memory-leaks dangling-pointer

从以下代码的最后一行返回的对象会发生什么?

class weight
{
   int kilogram;
   int gram;
public:
   void getdata ();
   void putdata ();
   void sum_weight (weight,weight) ;
   weight sum_weight (weight) ;
};
weight weight :: sum_weight(weight w2)
{
   weight temp;
   temp.gram = gram + w2.gram;
   temp.kilogram=temp.gram/1000;
   temp.gram=temp.gram%1000;
   temp.kilogram+=kilogram+w2.kilogram;
   return(temp);
}
int main(){
//.....//
   w3=w2.sum_weight(w1);
   w2.sum_weight(w1);
//.....//
}

它是否在内存中保留直至完成或被删除。

2 个答案:

答案 0 :(得分:0)

sum_weight(w1);将返回一个对象但你没有指定它意味着对象从未使用过。在第一种情况w3=w2.sum_weight(w1);中,它将调用赋值运算符以及复制构造函数和默认构造函数(即temp)  。在第二种情况下,将创建weight(第一个(weight w2)和第二个权重temp;)的两个实例。在从主方法O / S退出之前,Hance将调用两个对象的析构函数。 W3和从语句w2.sum_weight(w1);创建的临时对象(即temp

答案 1 :(得分:0)

让我们试着看看实际发生了什么:

#include <stdio.h>

class A {
    public:
        A() { printf("default constructing at %016zx\n", (size_t)this); }
        A(const A& a) { printf("copy constructing from %016zx at %016zx\n", (size_t)&a, (size_t)this); }
        void operator=(const A& a) { printf("assigning from %016zx to %016zx\n", (size_t)&a, (size_t)this); }
        ~A() { printf("destructing at %016zx\n", (size_t)this); }
        static A makeA() {
            A temp;
            return temp;
        }
};

int main() {
    A a;
    printf("calling makeA()\n");
    a = A::makeA();
    printf("returned from makeA()\n");
}

此代码在我的机器上产生以下输出(无编译器优化!):

default constructing at 00007ffe39415d0e
calling makeA()
default constructing at 00007ffe39415d0f
assigning from 00007ffe39415d0f to 00007ffe39415d0e
destructing at 00007ffe39415d0f
returned from makeA()
destructing at 00007ffe39415d0e

因此,您可以看到,在调用期间,makeA()中的变量已创建,makeA()中的变量值将分配给main()中的变量,而变量位于makeA()中{1}}被摧毁。 main()中的变量是在调用之前创建的,并且在main()返回其调用者之前一直有效。