#include <iostream>
using namespace std;
class Shallow {
private:
int *data;
public:
void set_data_value(int d) { *data = d; }
int get_data_value() { return *data; }
// Constructor
Shallow(int d);
// Copy Constructor
Shallow(const Shallow &source);
// Destructor
~Shallow();
};
Shallow::Shallow(int d) {
data = new int;
*data = d;
}
Shallow::Shallow(const Shallow &source)
: data(source.data) {
cout << "Copy constructor - shallow copy" << endl;
}
Shallow::~Shallow() {
delete data;
cout << "Destructor freeing data" << endl;
}
void display_shallow(Shallow s) {
cout << s.get_data_value() << endl;
}
int main() {
Shallow obj1 {100};
display_shallow(obj1);
ここまで大丈夫です
浅いobj2 {obj1}; ここで私のプログラムはokobj2.set_data_value(1000);を停止します。enter code here
この時点で誰かがこれを私に説明できますか?
0を返します。}私のプログラムの最後に何かがうまくいかない
問題は、を呼び出すたびShallow::~Shallow
にdata
ポインタのメモリが削除されるが、新しいすべての呼び出しがShallow
新しいメモリブロックを割り当てるわけではないことです。すべてdelete
が正確に1つに対応する必要がありますnew
。だが
display_shallow(obj1);
1)のポインタを使用する新しい一時Shallow
オブジェクト(display_shallow
値で渡す)を作成しdata
ますobj1
2)一時を破棄します。これにより、一時との両方で使用されているメモリのブロックが削除されます。 obj1
obj2
またobj1
、のポインタも共有しますが、これはもうどこも指していません。を呼び出そうとするとobj2.set_data_value(1000)
、無効なポインタが逆参照されます。これは未定義の動作です。核ミサイルを発射するのではなく、プログラムが単にクラッシュしただけで幸運だと考えるべきです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加