为什么必须new

jieao111 2008-03-14 09:21:44

《C++Primer》中关于讲到用指针计数的方法实现智能指针,书上讲解较为详细,但是当我把例子用到VC6.0和VC2005上时,编译通过可是不能运行,一运行就弹出错误框。小生实在不解错在哪里,请前辈高人指点!以下是代码:

#include "stdafx.h"
class U_Ptr
{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int *p): ip(p), use(1){ }
~U_Ptr( ) {delete ip;}
};

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 == 0) delete ptr;}
private:
U_Ptr *ptr;
int val;
};

int _tmain(int argc, _TCHAR* argv[])
{
int obj = 2;
HasPtr p1(&obj, 42);
HasPtr P2(p1);
return 0;
}


问题点数:20 回复次数:3 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复


加为好友
发送私信
在线聊天
dizuo
Submariner
等级:
发表于:2008-03-14 16:03:251楼 得分:0
你实际上就没有new 啊

修改 删除 举报 引用 回复

加为好友
发送私信
在线聊天
dizuo
Submariner
等级:
发表于:2008-03-14 16:05:052楼 得分:20
C/C++ codeint _tmain(int argc, _TCHAR* argv[])
{
int* obj = new int(2); //只有new以后才可以执行delete;
HasPtr p1(obj, 42);
HasPtr P2(p1);
return 0;
}



修改 删除 举报 引用 回复

加为好友
发送私信
在线聊天
max007super
菩提小鸟
等级:
发表于:2008-03-14 16:30:543楼 得分:0
呵呵谢谢Submariner老大!
问题解决了。

...全文
149 5 打赏 收藏 转发到动态 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoufuguo8802 2008-03-15
  • 打赏
  • 举报
回复
new和delete要相对应
hastings 2008-03-14
  • 打赏
  • 举报
回复
这代码看了亲切,哈.哈..
new出来的才能delete
qiuqiu173 2008-03-14
  • 打赏
  • 举报
回复
nt _tmain(int argc, _TCHAR* argv[])
{
int* obj = new int[2];//只有new以后才可以执行delete;
HasPtr p1(obj, 42);
HasPtr P2(p1);
return 0;
}

new 类似C语言的malloc,是分配内存空间用的。
new 和delete是成对出现的
Inhibitory 2008-03-14
  • 打赏
  • 举报
回复
这个代码有问题,如:
int _tmain(int argc, _TCHAR* argv[])
{
int* obj = new int(2); //只有new以后才可以执行delete;
HasPtr p1(obj, 42);
delete obj; // 先把指针给删了,结果可想而知会怎么样.
HasPtr P2(p1);
return 0;
}
taodm 2008-03-14
  • 打赏
  • 举报
回复
兄弟,前面介绍new、delete的章节认真看过没?
不知道不是new出来的不能delete这个基本知识?

63,594

社区成员

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