1

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

3 回答 3

2

那是因为你按值返回:

sample pass(sample const& ob1)
{
   //...
   return ob1;  
}

并且不能保证会发生 RVO。在这种情况下,我什至不确定它是否发生。

于 2012-06-05T11:40:19.613 回答
0

您正在sample按值返回;这涉及到 a 的构造和销毁sample(尽管在某些情况下它可以被优化掉)。

于 2012-06-05T11:40:10.907 回答
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);
}
于 2017-08-24T12:09:20.440 回答