c++ 复制指针释放问题

问题描述

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)<<endl;
//
int *intp = new int(10);
HasPtr ptr3(intp, 20);
delete intp;
intp = NULL;
ptr3.set_ptr_val(22);
cout << *(ptr3.ptr)<<endl;
return 0;
}

int *intp = new int(10);
HasPtr ptr3(intp, 20);
delete intp;
intp = NULL;
ptr3.set_ptr_val(22);
cout << *(ptr3.ptr)<<endl;
intp删除了,程序照样执行,不知道为什么,ptr3.ptr 与intp指向同一个位置

解决方案

指针释放,未必这块内存一定被再次分配出去,在此期间,程序运行的行为是不可预料的。所以在释放后,就不要再使用指向它的指针。

解决方案二:

复制指针目的无非就是不同地方使用,都是用一样的资源,有一处释放掉了,其它的也释放掉了

解决方案三:

ptr3.ptr和intp不是同一个内存,他们内容是不一样的。就好像你定义了int a,b;a=10;b=10;a=0;这个时候判断:b!=0
因此intp释放后ptr3.ptr肯定不指向NULL,你填值可能不会崩溃代码,但是还是危险操作。

解决方案四:

指针释放后,表示这一块区域会被回收,但是有可能你再次访问的时候,它还没有被重新使用,所以恰巧可以被访问到
但是这个行为对编译器来说是UB。

时间: 2024-11-02 07:12:03

c++ 复制指针释放问题的相关文章

c-面试中遇到的指针释放问题

问题描述 面试中遇到的指针释放问题 老师问我,为什么定义一个变量,比如int a;用完就可以不用管,但是定义一个指针,用完了却要释放空间?我的回答是,因为指针指向的是一个地址...被赤裸裸嘲笑..网上百度一番,也没看出个所以然.求大神帮忙解答 解决方案 因为int a定义的变量在堆栈上,堆栈在函数调用完成后自动清栈.new / malloc定义的在堆上,所以要自己释放. 解决方案二: 1)定义一个指针并不需要释放空间 2)只有用指针接收动态分配的内存(堆空间),才需要释放空间 原因是释放空间,内

xml-为什么在C++用智能指针循环打开XML文件时指针释放时出错

问题描述 为什么在C++用智能指针循环打开XML文件时指针释放时出错 小弟在VS2012中用C++编一个打开XML的程序中遇到了些问题.我打开XML的方法是通过打开一个索引XML文件(Index)然后获得子XML文件的路径,然后在根据这些路径用循环的方式打开子XML文件获取里面的信息.但是,我的程序不知道为什么出错,当子XML是只有一个时,程序就可以正常运行,当子XML是多个的时候,程序就提升出错,有数据中断.我设了断点查看错误原因,具体是在读完子XML,并进行完xmlfile.UnLoadXM

xml-C++用智能指针循环打开XML文件时指针释放时出错

问题描述 C++用智能指针循环打开XML文件时指针释放时出错 小弟在VS2012中用C++编一个打开XML的程序中遇到了些问题.我打开XML的方法是通过打开一个索引XML文件(Index)然后获得子XML文件的路径,然后在根据这些路径用循环的方式打开子XML文件获取里面的信息.但是,我的程序不知道为什么出错,当子XML是只有一个时,程序就可以正常运行,当子XML是多个的时候,程序就提升出错,有数据中断.我设了断点查看错误原因,具体是在读完子XML,并进行完xmlfile.UnLoadXML()后

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

C语言中指针释放问题,函数free()的使用。

问题描述 C语言中指针释放问题,函数free()的使用. 各位大虾们,C语言中如果不是指向使用malloc,realloc.calloc动态申请的内存的指针,是不是就不需要free()释放该指针了呢? 比如说申请了一个指向结构体的指针, 或者是指向一个整型变量的指针.谢谢各位大虾. 解决方案 如果你没用*alloc *函数的话,你应该并没有申请内存,你只是定义了一个指针变量而已,当然就不用free释放了. 解决方案二: 你动态申请了内存,就必须要释放. 如果使用一个指针,指向一块已经存在内存,就

《从缺陷中学习C/C++》——6.8 指针释放后再次使用

6.8 指针释放后再次使用 从缺陷中学习C/C++代码示例 class MyClass{ private: int m_val; public: MyClass(int value){ m_val = value; printf("new class A\n"); } void getValue(){ printf("%d\n",m_val); } }; void function_a() { MyClass *A = new MyClass (1); functi

C++ 智能指针深入解析

以下是对C++中智能指针的使用进行了详细的分析介绍,需要的朋友可以参考下   1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制.Java的 垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收. 但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟 病. 更进一步地说,智能指针的出

C++ 智能指针深入解析_C 语言

1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制.Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收.但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟病. 更进一步地说,智能指针的出现是为了满足管理类中指针成员的需要.包含指针成员的类需要特别注意复制控制和赋值操作,

C++中智能指针如何设计和使用_C 语言

     智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数:对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用