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

Memory allocation of returned object in c++

本文关键字:内存 分配 对象 返回 C++      更新时间:2023-10-16

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

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);
//.....//
}

它是保留在内存中直到完成还是被删除。

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

#include <stdio.h>
class A {
    public:
        A() { printf("default constructing at %016zxn", (size_t)this); }
        A(const A& a) { printf("copy constructing from %016zx at %016zxn", (size_t)&a, (size_t)this); }
        void operator=(const A& a) { printf("assigning from %016zx to %016zxn", (size_t)&a, (size_t)this); }
        ~A() { printf("destructing at %016zxn", (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() 中的变量被销毁。main()中的变量在调用之前创建,并且在main()返回到其调用方之前一直有效。

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