コピーコンストラクターをオーバーライドすると、最初の削除自体でセグメンテーション違反が発生するのはなぜですか。出力:
$./a.out
inside ctor
inside copy-ctor
Say i am in someFunc
inside dtor
*** glibc detected *** ./a.out: free(): invalid pointer: 0xb75f3000 ***
copy-ctor をオーバーライドしないs1.PrintVal()
と、それが呼び出され、*ptr に予期されるセグ フォールトが発生することがわかります。
デフォルトとオーバーライドされたコピー-ctor がある場合とない場合の 2 つの異なる動作があるのはなぜですか?
#include<iostream>
using namespace std;
class Sample
{
public:
int *ptr;
Sample(int i)
{
cout << "inside ctor" << endl;
ptr = new int(i);
}
Sample(const Sample &rhs)
{
cout << "inside copy-ctor" << endl;
}
~Sample()
{
cout << "inside dtor" << endl;
delete ptr;
}
void PrintVal()
{
cout <<" inside PrintVal()."<<endl;
cout << "The value is " << *ptr<<endl;
}
};
void SomeFunc(Sample x)
{
cout << "Say i am in someFunc " << endl;
}
int main()
{
Sample s1= 10;
SomeFunc(s1);
s1.PrintVal();
return 0;
}