关于智能指针的问题,求助高手

johnny_ysx 2007-07-04 12:14:43
因为项目的需要,我自定义了一个简化的指针类方便在程序结束时候清理原始指针所指向的数据.但是程序在析构函数的时候报错(User breakpoint called from code at 0xxxxxxxxx),代码如下:
template<class T>
class IVPoint
{
private:
T* m_pIVPoint;

public:
IVPoint()
{
m_pIVPoint = NULL;
}
IVPoint(T* pIV){ m_pIVPoint = pIV; }
~IVPoint()
{
if (m_pIVPoint)
{
imaqDispose(m_pIVPoint);
}
}

T* GetInst()const{ return m_pIVPoint; }
T* operator->(){ return m_pIVPoint; }
T& operator*(){ return *m_pIVPoint; }

T* operator=(T* pIV)
{
if (m_pIVPoint && (m_pIVPoint != pIV))
{
imaqDispose(m_pIVPoint);
}
return (m_pIVPoint = pIV);
}

IVPoint<T>& operator=(const IVPoint<T>& IV )
{
if (IV.m_pIVPoint != m_pIVPoint)
{
imaqDispose(m_pIVPoint);
m_pIVPoint = IV.m_pIVPoint;

}

return *this;
}

int operator==(T* pIV)const{ return (m_pIVPoint == pIV); }
int operator!=(T* pIV)const{ return (m_pIVPoint != pIV); }

};
请高手指教到底错在哪里?
注: imaqDispose()是一个清理指针所指向数据的函数,在别处使用的时候没有问题. 谢谢各位啦!
...全文
215 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnny_ysx 2007-07-05
  • 打赏
  • 举报
回复
终于发现错误了, 因为imaqDispose()函数不能释放所有类的空间,只能把几个个别的类另做处理了.还是要谢谢大家的帮助,结贴啦.
星羽 2007-07-04
  • 打赏
  • 举报
回复
是不是 你的 imaqDispose(m_pIVPoint);有问题

把 imaqDispose(m_pIVPoint); 去掉看看
lyg_zy 2007-07-04
  • 打赏
  • 举报
回复
up
healer_kx 2007-07-04
  • 打赏
  • 举报
回复
随便找个智能指针都能满足你的要求的。
  • 打赏
  • 举报
回复
函数按照楼上的声明写
johnny_ysx 2007-07-04
  • 打赏
  • 举报
回复
同意楼上的观点,是很久没温习了,不好意思啦,不过问题不在那里.
taodm 2007-07-04
  • 打赏
  • 举报
回复
您还是找本C++ Primer,温习一下运算符重载吧。
bool operator==(const T & pIV)const;
bool operator!=(const T & pIV)const;

xlbdan 2007-07-04
  • 打赏
  • 举报
回复

IVPoint(IVPoint<T>& IV) //拷贝构造函数
{
m_pIVPoint=IV.m_pIVPoint;
IV.m_pIVPoint=NULL; //置空,所以不能用const参数
}


IVPoint<T>& operator=(IVPoint<T>& IV ) //operator=
{
if (this==&IV)
{
return *this;
}
delete m_pIVPoint;
m_pIVPoint=IV.m_pIVPoint;
IV.m_pIVPoint=NULL; //置空
return *this;
}


T& operator*() //operator *
{
return *m_pIVPoint;
}
xlbdan 2007-07-04
  • 打赏
  • 举报
回复
哦上面说的有错误,是你没有实现拷贝构造函数,而operator=修改一下就行,还有operator* 要定义,如下
xlbdan 2007-07-04
  • 打赏
  • 举报
回复
你的问题是当拷贝构造和赋值这两个操作被执行的时候,没有将被拷贝(或赋值方)的那个智能指针对象的内部指针置空,导致最后析构的时候对一块内存释放了两次,产生错误.

另外你的operator=的返回类型不正确,应该返回类类型才对,而另外要重载一个operator*来获得内部指针的指向内容

我在下面把你的copy ctor,operator*和operator=写一下:

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧