c++指针复制指向同一个位置问题
2015-04-07 14:46
169 查看
今天看primer c++遇到一个问题:
此时打印结构为:
34 42
45 45
0
如果这样:
ptr3.set_ptr_val(22);
// ptr3.set_ptr(ptr3.ptr);
打印结果:
34 42
45 45
22
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。这种问题是最难调试的
指针虽然释放内存依旧可一个使用。但是避免野指针的发生一定要先delete 在设置为NULL
#include <iostream> #include <string> #include <cstdio> 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)<<endl; // int *intp = new int(10); HasPtr ptr3(intp, 20); delete intp; intp = NULL; // ptr3.set_ptr_val(22); ptr3.set_ptr(ptr3.ptr); cout << *(ptr3.ptr)<<endl; return 0; }
此时打印结构为:
34 42
45 45
0
如果这样:
ptr3.set_ptr_val(22);
// ptr3.set_ptr(ptr3.ptr);
打印结果:
34 42
45 45
22
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。这种问题是最难调试的
指针虽然释放内存依旧可一个使用。但是避免野指针的发生一定要先delete 在设置为NULL
相关文章推荐
- C/C++——C风格的字符串的指针指向的内存位置问题(易错)
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- C 语言中返回一个指向自动变量的指针存在的问题
- 【C++】指向指针的指针int**的深复制的实现
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 由“一个关于指针的小问题”想到的:常量指针与指向常量的指针
- C++指向虚函数表指针存放位置
- Qt C++ 指向对象的指针与内存分配的问题分析
- 两个指针指向同一个由malloc分配的空间,free掉一个问题
- C++指针问题--为什么父类指针可以指向子类反之则不行
- 关于指向结构体的指针——又一个指针用法中容易忽略的问题
- 你好,C++(15)四两拨千斤——3.9 指向内存位置的指针
- C++ 单例模式中处理在类中声明一个指向一个自己的指针,在编译时显示定义的指针未定义的处理办法
- vs2003复制一个web窗体,没有更改指向同一个cs 文件,引发大问题
- C++关于父类指针指向子类对象的问题
- 一个简单的指针指向问题的讨论
- (转载)你好,C++(15)四两拨千斤——3.9 指向内存位置的指针
- C++指针小结:由一个问题引发的。。。。。。。。。。。。。。。。。。。
- c/c++向函数传递指针并修改其指向的问题
- C/C++—— 写一个函数,它的参数为指向函数的指针,返回类型也为指向函数的指针