C++ 中返回对象的内存分配
Memory allocation of returned object in c++
从
以下代码的最后一行返回的对象会发生什么情况
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
(
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配