博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ primer 第十三章 智能指针
阅读量:6182 次
发布时间:2019-06-21

本文共 1256 字,大约阅读时间需要 4 分钟。

hot3.png

#include 
using namespace std;class HasPtr;class U_Ptr{ friend class HasPtr; U_Ptr(int * p) :ip(p), use(1) {} ~U_Ptr() { delete ip;  } int * ip; size_t use;};class HasPtr{public: HasPtr(int * p,int i) :ptr(new U_Ptr(p)), val(i){} HasPtr(const HasPtr & orig) : ptr(orig.ptr), val(orig.val) { ++ptr->use; } HasPtr & operator = (const HasPtr &); ~HasPtr() { if (--ptr->use == 1) delete ptr; } public: int * get_ptr()const{ return ptr->ip;} int get_int() const  { return val; } void set_ptr(int *p){ ptr->ip = p; } void set_int(int i) { val = i; } int get_ptr_val() const { return *ptr->ip; } int set_ptr_val(int i){ *ptr->ip = i; }private: U_Ptr * ptr; int val;};HasPtr & HasPtr::operator=(const HasPtr & rsh){ ++rsh.ptr->use; if (--ptr->use == 0) delete ptr; ptr = rsh.ptr; val = rsh.val; return * this;}int main(void){ //int obj = 0; // 当像上面那样去定义obj时,是在栈上面申请的变量。在delete的时候,会删除obj指针指向的变量。这样就出现了段错误 int * obj = new int(1); obj[0] = 1; HasPtr *ptr1 = new HasPtr(obj,obj[0]); HasPtr *ptr2 = new HasPtr(*ptr1); HasPtr *ptr3 = ptr2; HasPtr ptr4 = *ptr2; delete ptr1;  // delete ptr2; cout << "end " << endl;}

在delete指针的时候,一直出现段错误。

最后发现是最开始创建的指针是指向了栈上的一个变量。所以delete的时候出错了。

改成从堆上面申请的内存的变量,就可以了。

转载于:https://my.oschina.net/aslanjia/blog/606450

你可能感兴趣的文章
关于ubuntu安装软件的问题:apt-get和dpkg区别?
查看>>
Go学习笔记之基础数据类型
查看>>
探测断链
查看>>
PYTHON3连接MYSQL数据库
查看>>
mysql查询缓存
查看>>
实现自动脱壳被加密的Net程序集
查看>>
多核应用架构关键技术—软件管道与SOA
查看>>
Windows内核原理与实现
查看>>
也欢迎您访问我的个人主页http://www.april1985.com(原hesicong.com或april1985.com)
查看>>
MPQ技术内幕__
查看>>
文档生产工具 Doxygen
查看>>
PowerDesigner(一)-PowerDesigner概述(系统分析与建模)(转)
查看>>
Thrift RPC框架介绍
查看>>
OTL翻译(3) -- OTL的主要类
查看>>
x86架构的android手机兼容性问题
查看>>
InvalidIndexNameException[Invalid index name [2Shard], must be lowercase]
查看>>
POJ 1067 取石子游戏
查看>>
sum函数
查看>>
常用音频数据库记录
查看>>
题二:写一个单例模式
查看>>