为什么程序不成功呢?

vanxining 2010-03-18 10:36:23
这个程序是一个模拟图书馆存书和借出的,使用了类和链表。
但是似乎store函数执行成功,而borrow则失败,使用vs调试不了,因为虽然停下来了,但没有提示断点!
谢谢~~~



#include <iostream>
using namespace std;

class Book
{
public :
Book()
{
sum++;
}

~Book()
{
sum -= 1;
}

//静态成员函数,返回总数
static int GetSum()
{
return sum;
}

Book *next;

private :

static int sum; //静态数据成员,记录总数
} ;


//从表尾插入结点
void store(Book*& f, Book*& r, int w)
{
Book *p = new Book[w];
r = p + w - 1;
if(f == NULL)
{
f = p;
}
for(int i=0; i<w; i++)
{
p -> next = p+1 ;
p++;
}
r->next = NULL;
}

//售出货物,从表头删除结点
void borrow(Book * & f ,Book * & r,int w )
{
if ( f == NULL )
{
cout << "No any Book!\n" ;
return ;
}

Book* q;
for(int i=0; i<w; i++)
{
q = f;
f = f -> next ;
delete q; // 这句失败了,貌似陷入了死循环,但CPu占有率并不升高??
}

cout << "borrowed.\n" ;
}

int Book::sum = 0;

int main()
{
Book * front = NULL ,* rear = NULL ;

int w ;
int choice;
do
{
cout << "Please choice:\n" ;
cout << "Key of 1 is to store,\nKey of 2 is to borrow,\nKey of 0 is over.\n" ;
cin >> choice ;
switch ( choice ) // 操作选择
{
case 1 :
{
cout << "Input number of book(s): " ;
cin >> w ;
store( front, rear, w ) ;
break ;
}
case 2 :
{
cout << "Input number of book(s) : " ;
cin >> w ;
borrow( front, rear ,w) ;
break ;
}
case 0 : // 键入0,结束
break ;
}
cout << "Now sum is:" << Book::GetSum() <<"\n-------------------------"<< endl ;
}
while( choice ) ;
return 0;
}

...全文
172 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vanxining 2010-03-19
  • 打赏
  • 举报
回复
哦,原来如此!谢谢各位大侠!
「已注销」 2010-03-19
  • 打赏
  • 举报
回复
完全不懂
还没看到那里
mark一下
lxslove 2010-03-19
  • 打赏
  • 举报
回复
对new和delete的原理不清楚造成的错误。
new一块内存的话,一般的(非绝对)会在返回指针的前一个位置(一般4个字节)保存申请的内存的长度(这个长度大于或者等于等于申请的长度,new的自动优化),用delete的时候会根据这个长度释放内存。故new [] 的元素不能逐个delete释放。
在linux下用g++编译,这个长度就是放在指针的前一个位置的.



yuzl32 2010-03-19
  • 打赏
  • 举报
回复
new分配内存还涉及到内存分配粒度的问题,因此delete对其返回的值才可以释放。不能像代码中那样:
Book * p = new Book[5];
delete p+1,delete p+2,delete p+3,...这种方式释放。

更改一下代码如下:

//从表尾插入结点
void store(Book*& f, Book*& r, int w)
{
for(int i = 0; i < w; i ++)
{
Book *p = new Book;
if(f == NULL)
{
r = f = p;
}
r = r->next = p;
}
}
linxingyu404 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yuzl32 的回复:]
new分配内存还涉及到内存分配粒度的问题,因此delete对其返回的值才可以释放。不能像代码中那样:
Book * p = new Book[5];
delete p+1,delete p+2,delete p+3,...这种方式释放。

更改一下代码如下:

C/C++ code

//从表尾插入结点
void store(Book*& f, Book*& r……
[/Quote]是不是前面是new[],后面一定要是delete[],不能一个一个delete?
geegle403 2010-03-19
  • 打赏
  • 举报
回复
如果能一个个delete,呵呵,那就省了很多事哦...
adventurelw 2010-03-18
  • 打赏
  • 举报
回复
哦,应该是new[]和delete[]必须配对。
adventurelw 2010-03-18
  • 打赏
  • 举报
回复
3#正解,不是new出来的内存不要delete。
另外,borrow里面最好增加一个判断可以借出的书不能大于现有的书的数量。
还有,指针传参无需再加上引用,应该没有有益的意义。
yuzl32 2010-03-18
  • 打赏
  • 举报
回复
1) Book *p = new Book[w];

2) for(int i=0; i<w; i++)
{
q = f;
f = f -> next ;
delete q;
}
-------------
分配一块出来,再逐个释放?!可以么?
linxingyu404 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cattycat 的回复:]
既然用了链表,还用数组干什么。你的borrow里的那段for循环把w前面所有的节点都删除了,不知道是不是你想要的。
[/Quote]
没错吧
cattycat 2010-03-18
  • 打赏
  • 举报
回复
既然用了链表,还用数组干什么。你的borrow里的那段for循环把w前面所有的节点都删除了,不知道是不是你想要的。

64,281

社区成员

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

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