c++ポインタレプリケーションが同じ位置を指す問題

1671 ワード

今日primer c++を見て質問がありました.
#include 
#include 
#include 
using namespace std;

class HasPtr
{
public:
    HasPtr(int *p, int i):ptr(p), val(i){}
	int *get_ptr() const {return ptr;}
	int get_int() const {return val;}
	void set_ptr(int *p) {ptr = p;}
	void set_int(int v) {val = v;}
	int get_ptr_val() const { return *ptr;}
	void set_ptr_val(int val) const {*ptr = val;}

public:
	int *ptr;
	int val;
};
int main(int argc, char *argv[])
{
    int obj = 0;
	HasPtr ptr1(&obj, 42);
	HasPtr ptr2(ptr1);
        //  ptr1 val   ptr  ptr2        
	ptr1.set_int(34); //        ,       ,               
	cout << ptr1.get_int() << " " << ptr2.get_int() << endl;
	ptr1.set_ptr_val(45); //     ,        ,           。           set_ptr_val,            
	cout << *(ptr1.ptr) << " " << *(ptr2.ptr)<

印刷構造は次のとおりです.
34 42 45 45 0
この場合:
ptr3.set_ptr_val(22);  //ptr3.set_ptr(ptr3.ptr);
印刷結果:34,42,45,522
c++primerの公式言い方:int*ip=new int(42);//dynamically allocated int initialized to  42  HasPtr ptr(ip, 10);//Has Ptr points to same object asip does  delete ip;//object pointed to by ip is freed ptr.set_ptr_val(0);//disaster: The object to which Has Ptr points  was freed! 
修正:delete以降、そのメモリは依然として存在しますが、後でnewするときは、他の人に割り当てる可能性があります.ptrの中のポインタは依然としてこのメモリにアクセスできますが、他の人はあなたがこの値を修正することを知らないので、本の中ではdisasterと言っています.この問題はデバッグが最も難しい.
ポインタはメモリを解放しても1つ使用できます.ただし、野ポインタの発生を避けるには、まずdeleteをNULLに設定する必要があります.