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

请教一个关于内存回收的问题

code_guy 发布于 2010-10-15 12:33, 731 次点击
////定义一个关于糖的结构 赋值并输出////
#include <iostream>
using namespace std;
struct sugers
{
    char *name;
    float weigth;
    int hot;
};
void main()
{
    sugers *snack=new sugers;  //开辟sugers空间
    snack->name =new char;    //开辟name空间
    strcpy(snack->name,"Mocha Munch");  //赋值
    snack->weigth=2.3;  //赋值
    snack->hot=350;  //赋值
    cout<<"sugers name: "<<snack->name<<endl;  //输出name
    cout<<"sugers weight: "<<snack->weigth<<endl;  //输出weight
    cout<<"sugers hot: "<<snack->hot<<endl;     //输出hot

}

上面的代码  请问下 开辟的堆空间最后是怎么被回收的??
是不是只有在当堆空间的指针指向另外一个数据的时候  才有我们自己手动显示的回收先前开辟的空间?
不好意思  要是用词不当 请指出来
9 回复
#2
yangang22010-10-15 13:20
我给你举个例子int *p=new int;  其中p叫做栈中对象,new int叫作堆中对象,这是一个栈与堆的联合运用。若此语句在某个函数中定义,由于p是栈中对象,所以在超出定义p的函数内一定要delete p;手动释放内存资源,否则p的生命结束后,new int成为一个无法访问的区域,这就是内存泄露。主要有两种形式。指针变量超出生存期和指针另指向。
你用类来定义要好点,直接在析构函数中delete 指针对象释放资源。
#3
zhoufeng19882010-10-15 13:24
你上面的这个例子里程序里没有回收内存,程序结束后,由操作系统回收该程序的内存。
看已写C++ Primer,就明白了。
#4
2010-10-15 13:30
楼主其实可以在构造函数里申请name的堆内存  然后系统的时候回收name指向的堆内存


这样你sugers *snack=new sugers;  他是先开辟空间 然后调用构造函数  

之后释放这快对象的内存delete sugers;   这里是先调用析构函数   然后才释放对象的空间


这样就没有内存泄漏了
#5
code_guy2010-10-15 14:24
以下是引用yangang2在2010-10-15 13:20:34的发言:

我给你举个例子int *p=new int;  其中p叫做栈中对象,new int叫作堆中对象,这是一个栈与堆的联合运用。若此语句在某个函数中定义,由于p是栈中对象,所以在超出定义p的函数内一定要delete p;手动释放内存资源,否则p的生命结束后,new int成为一个无法访问的区域,这就是内存泄露。主要有两种形式。指针变量超出生存期和指针另指向。
你用类来定义要好点,直接在析构函数中delete 指针对象释放资源。
你的意思是你的例子中当p指向另外的内存时  才需要手动delete p 来释放先前p指向的内存? 如果p不指向新的内存就不需要手动释放了  可以这样理解么?
#6
yxwsbobo2010-10-15 15:57
new 出来的内存都是 从堆中分配的  除了程序被关闭,否则不会被自动回收,只能手动delete
#7
yangang22010-10-15 16:44
回复 5楼 code_guy
你误解了我的意思,我说的是以上那两种情况都属于内存泄露。即指针超出它的生命周期却没有delete释放资源和指针另指向。给你再举个指针另指向的例子.
int *p1=new int;//让p1指针来指向堆中对象
int *p2=new int;
p1=p2;//p1指针又另指向了p2所指向的同一堆中对象。那么p1原来所指向的那个堆中对象就无法再访问,所以发生了内存泄露
#8
code_guy2010-10-15 20:12
回复 7楼 yangang2
恩 你帮我看下上面的代码   当我手动加上delete 释放的时候 出现错误
去掉就没了

就是困惑在什么时候该手动释放 什么时候不用释放

明天给分 3q
#9
yangang22010-10-15 20:39
回复 楼主 code_guy
给你优化了下,用面向对象方式编写:
#include <iostream>
using namespace std;
class sugers
{
public:
    sugers(char *Name,float Weight, int Hot)
    {
    int i;
    name=new char[strlen(Name)+1];
    for(i=0;i<strlen(Name);i++)
    {
        name[i]=Name[i];
    }
    name[i]='\0';
    weight=Weight;
    hot=Hot;

    }
    ~sugers(){delete []name;}
     char * PrintName(){return name;}
     float PrintWeight(){return weight;}
     int  PrintHot(){return hot;}
private:
    char *name;
    float weight;
    int hot;
};
void main()
{
    sugers *snack=new sugers("Mocha Munch",2.3f,350);  //开辟sugers空间
    cout<<"sugers name: "<<snack->PrintName()<<endl; //输出name
    cout<<"sugers weight: "<<snack->PrintWeight()<<endl;//输出weight
    cout<<"sugers hot: "<<snack->PrintHot()<<endl;    //输出hot
    delete snack;

}


[ 本帖最后由 yangang2 于 2010-10-15 21:11 编辑 ]
#10
寒风中的细雨2010-10-16 00:09
new 和 delete 成对出现
1