当对象引用作为参数传递时,为什么在函数(pass(示例const& ob1))范围之后调用析构函数?为什么在传递对象引用的同时在函数pass()中创建一个新对象?
帮助我,我收到了内存转储错误
#include<iostream>
using namespace std;
class sample
{
public:
int *ptr;
sample()
{
cout<<"this is default constructor & addr "<<this<<endl;
}
sample(int i)
{
cout<<"this is single parameter constructor & addr "<<this<<endl;
ptr=new int[i];
}
void disp()
{
cout<<"hello \n";
}
~sample()
{
cout<<"destructor & addr "<<this;
delete ptr;
}
};
sample pass(sample const& ob1)
{
for(int i=0;i<5;i++)
ob1.ptr[i]=10;
return ob1;
}
int main()
{
sample obj(5);
sample copy;
cout<<"before calling \n";
obj.disp();
pass(obj);
copy.disp();
cout<<"after calling \n";
return 0;
}
答案 0 :(得分:2)
那是因为你按价值回归:
sample pass(sample const& ob1)
{
//...
return ob1;
}
并不能保证会发生RVO。在这种情况下,我甚至不确定可以发生。
答案 1 :(得分:0)
您按价值返回sample
;这涉及sample
的构建和破坏(尽管在某些情况下它可以是optimised away)。
答案 2 :(得分:0)
函数pass()正在创建一个新对象,因为该对象是按值返回的,而不是通过引用返回的。 按值返回对象将调用复制构造函数,并将创建一个新对象(临时对象),该函数将在函数返回后立即销毁。
要避免创建临时对象,请尝试按引用返回对象。 此外,默认构造函数不会初始化导致内存转储错误的整数指针。
sample const& pass(sample const &ob1)
{
for(int i=0;i<5;i++)
ob1.ptr[i]=10;
cout << "pass & addr " << &ob1 << endl ;
return ob1;
}
sample()
{
cout<<"this is default constructor & addr "<<this<<endl;
this->ptr = new (int);
}