当对象引用作为参数传递时,为什么析构函数在函数作用域结束后调用?

时间:2012-06-05 11:38:25

标签: c++ pass-by-reference destructor

当对象引用作为参数传递时,为什么在函数(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;
}

3 个答案:

答案 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);
}