| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 731 人关注过本帖
标题:请教一个关于内存回收的问题
只看楼主 加入收藏
code_guy
Rank: 2
等 级:论坛游民
帖 子:28
专家分:33
注 册:2010-5-26
结帖率:0
收藏
已结贴  问题点数:10 回复次数:9 
请教一个关于内存回收的问题
////定义一个关于糖的结构 赋值并输出////
#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

}

上面的代码  请问下 开辟的堆空间最后是怎么被回收的??
是不是只有在当堆空间的指针指向另外一个数据的时候  才有我们自己手动显示的回收先前开辟的空间?
不好意思  要是用词不当 请指出来
搜索更多相关主题的帖子: 内存 
2010-10-15 12:33
yangang2
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:64
专家分:432
注 册:2010-9-1
收藏
得分:0 
我给你举个例子int *p=new int;  其中p叫做栈中对象,new int叫作堆中对象,这是一个栈与堆的联合运用。若此语句在某个函数中定义,由于p是栈中对象,所以在超出定义p的函数内一定要delete p;手动释放内存资源,否则p的生命结束后,new int成为一个无法访问的区域,这就是内存泄露。主要有两种形式。指针变量超出生存期和指针另指向。
你用类来定义要好点,直接在析构函数中delete 指针对象释放资源。
2010-10-15 13:20
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:2 
你上面的这个例子里程序里没有回收内存,程序结束后,由操作系统回收该程序的内存。
看已写C++ Primer,就明白了。
2010-10-15 13:24
cacker
该用户已被删除
收藏
得分:2 
提示: 作者被禁止或删除 内容自动屏蔽
2010-10-15 13:30
code_guy
Rank: 2
等 级:论坛游民
帖 子:28
专家分:33
注 册:2010-5-26
收藏
得分:0 
以下是引用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不指向新的内存就不需要手动释放了  可以这样理解么?
2010-10-15 14:24
yxwsbobo
Rank: 5Rank: 5
等 级:职业侠客
帖 子:345
专家分:306
注 册:2007-10-29
收藏
得分:2 
new 出来的内存都是 从堆中分配的  除了程序被关闭,否则不会被自动回收,只能手动delete

How are you 怎么是你?
How old are you   怎么老是你?
2010-10-15 15:57
yangang2
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:64
专家分:432
注 册:2010-9-1
收藏
得分:0 
回复 5楼 code_guy
你误解了我的意思,我说的是以上那两种情况都属于内存泄露。即指针超出它的生命周期却没有delete释放资源和指针另指向。给你再举个指针另指向的例子.
int *p1=new int;//让p1指针来指向堆中对象
int *p2=new int;
p1=p2;//p1指针又另指向了p2所指向的同一堆中对象。那么p1原来所指向的那个堆中对象就无法再访问,所以发生了内存泄露
2010-10-15 16:44
code_guy
Rank: 2
等 级:论坛游民
帖 子:28
专家分:33
注 册:2010-5-26
收藏
得分:0 
回复 7楼 yangang2
恩 你帮我看下上面的代码   当我手动加上delete 释放的时候 出现错误
去掉就没了

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

明天给分 3q
2010-10-15 20:12
yangang2
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:64
专家分:432
注 册:2010-9-1
收藏
得分:2 
回复 楼主 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 编辑 ]
2010-10-15 20:39
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:2 
new 和 delete 成对出现
2010-10-16 00:09
快速回复:请教一个关于内存回收的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030044 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved