注册 登录
编程论坛 C++教室

什么时候需要用delete,已经没有使用产生什么后果,

未未来 发布于 2013-06-26 22:17, 727 次点击
main.cpp
程序代码:
#include<iostream>
#include"student.hpp"
using namespace std;
int main(){

student *head,*stu;
long del_num;
cout<<"input records:"<<endl;
head=creat();
print(head);
cout<<endl<<"input the deleted number:";
cin>>del_num;
head=del(head,del_num);
print(head);
cout<<endl<<"input the insert number:";
stu=new student;
cin>>stu->num>>stu->score;
while(stu->num!=0){
    head=insert(head,stu);
stu=new student;
cin>>stu->num>>stu->score;
}
    print(head);
return 0;   
}


student.hpp
程序代码:
#include<iostream>
using namespace std;
struct student{
long num;
float score;
student  *next;
   
};
int n;
student *creat(){
    student *head;
    student *p1,*p2;
    n=0;
    p1=p2=new student;
    cin>>p1->num>>p1->score;
    head=NULL;
    while(p1->num!=0){
        n=n+1;
        if(n==1)head=p1;
        else p2->next=p1;
        p2=p1;
        p1=new student;
        cin>>p1->num>>p1->score;
    }
    p2->next=NULL;
    return (head);
}
void print(student *head)
{
    student *p;
    cout<<endl<<"Now,These"<<n<<"records are:"<<endl;
    p=head;
    if(head!=NULL)
    do{
        cout<<p->num<<" "<<p->score<<endl;
        p=p->next;
    }while(p!=NULL);
}

 student * del(student *head,long num)

 {
     student *p1,*p2;
     if(head==NULL)
     {
         cout<<"list null"<<endl;return (head);
         
     }
     p1=head;
     while(num!=p1->num&&p1->num!=NULL)
     {
         p2=p1;
         p1=p1->next;
     }
     
     if(num==p1->num){
         if(p1==head)head=p1->next;
         else p2->next=p1->next;
         cout<<"delete:"<<num<<endl;
         n=n-1;
     }
     
     
     
     
     else
     cout<<"cannot find"<<num;
   
     return (head);
     

 }

 

 

 

 student *insert(student *head,student *stud)

 {
     student *p0,*p1,*p2;
     p1=head;
     p0=stud;
     if(head==NULL){
         head=p0;
         p0->next=NULL;
     }
     else{
     while((p0->num>p1->num)&&(p1->next!=NULL)){
         p2=p1;
         p1=p1->next;
     }   
     if(p0->num<=p1->num)
     {
         if(head==p1)head=p0;
         else p2->next=p0;
         p0->next=p1;
     }
     else{
         p1->next=p0;
         p0->next=NULL;
     }
         
         
         
         n=n+1;
         return (head);
         
         
         
         
         
     }

 }


在mian程序里需要在最后加上 delete head;
                             delete stu;吗
自我感觉需要,但是程序运行并没有出错,已经教材书上也没有这样做
所以不解了,求解释
5 回复
#2
peach54602013-06-27 06:07
我都没看到main,你main在哪?
#3
peach54602013-06-27 06:09
至于什么时候需要用delete
自己new出来的东西需要delete
#4
司马冷泪2013-06-27 12:51
分配内存空间,需要销毁,不然会内存泄漏
#5
TonyDeng2013-06-27 19:31
在Windows(NT内核)下写的C/C++不需要,只是不规范而已,写.net的C++/CLI程序用gcnew分配内存根本就不存在对应的delete指令。
#6
TonyDeng2013-06-27 20:11
内存泄漏,在系统内存没有耗尽前是没感觉到后果的,正如仓库还有空余的空间,就仍然可以储存货物一样。内存泄漏是后患,一直霸占住内存资源,程序多运行一次,就多占一份,反复运行,反复占用。如果操作系统不强制没收这些垃圾,它自己就感觉紧张,所以Windows是主动打扫的,就算你的程序释放,在程序结束后Windows就把它曾经用过的内存都回收了,就像这个程序从来没运行过一样,因此能够保证不怕内存泄漏,但别的操作系统并不保证这一点(同样是微软的DOS/Windows98等旧系统,就没有这种功能),具体要看操作系统的说明。

编程要看运行平台,这是必须要注意的,其实只要固定了平台,不需太在意移植性,也不可能保证有绝对的可移植性,转移平台不修改代码,那是很少能够做到的。
1