c++ポインタレプリケーションが同じ位置を指す問題
1671 ワード
今日primer c++を見て質問がありました.
印刷構造は次のとおりです.
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に設定する必要があります.
#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に設定する必要があります.