荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: bakey (sbb的猪), 信区: Program
标  题: [合集]编写一个类,实现简单的栈
发信站: 荔园晨风BBS站 (2005年11月30日16:48:14 星期三), 站内信件

☆   1  ──────────── 我是分割线 ─────────────────☆
发信人: Jelis (fafa), 信区: Program
标  题: 编写一个类,实现简单的栈
时  间: Fri Nov 18 14:51:10 2005

#include<iostream.h>
struct node
{
    int a;
};

class stack
{
public:
    void put(int item);
protected:
    node*head;
};
void  stack::put(int item)
{
    node *ps=new node;
         for(node*pguide=head->next;pguide->next;)
            pguide=pguide->next;
}
int  stack::get()
{int a;
     while(head==NULL)
        return 0;

return a;
}
void main()
{
stack st;
st.put(10);
st.put(12);
st.put(14);
cout<<st.get()<<endl;
cout<<st.get()<<endl;
}
编写一个类,实现简单的栈~~运行有错
 请高手指点指点~~感谢~!!


☆   2  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (熊出没), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月18日15:52:46 星期五

首先要指出你这个程序写得很乱,没有很好地理解每个指针的指向,随随便便地
乱指,所以肯定会指向还没分配地内存空间,导致出错
其次,你没有理解栈这个模型。你每次get一个栈的值,竟然没有delete掉那个节点
这样的栈模型肯定是不对的。
我把你的程序改了下,基本符合对栈的要求了。还有不少优化的,懒得写了
#include<iostream.h>
struct node
{
    int a;
    node*next;
};

class stack
{
public:
    stack();
    void put(int item);
    int get();
protected:
    node*head;
};
stack::stack()
{
    head = NULL;
}
~~~~这个构造函数是不可少的,你的head指针一开始并不指向null
void  stack::put(int item)
{
    node *ps,*pguide;
    if(head==NULL) {
        ps = new node;
        ps->a = item;
        ps->next = NULL;
        head=ps;
    }
    else {
        pguide = head;
        while (pguide->next != NULL)
            pguide = pguide->next;
        ps = new node;
        ps->a = item;
        ps->next = NULL;
        pguide->next = ps;
    }
}
int  stack::get()
{
    int a;
    if (head==NULL)
        return 0;
    node *pguide,*tmp;
    for(pguide=head,tmp=head ;  ; )
    {
        a = pguide->a;
        if (pguide->next == NULL) {
            tmp->next = NULL;
            delete(pguide);
            break;
        }
        tmp = pguide;
        pguide=pguide->next;
    }
    return a;
}
void main()
{
    stack st;
    st.put(10);
    st.put(12);
    st.put(14);
    cout<<st.get()<<endl;
    cout<<st.get()<<endl;
    cout<<st.get()<<endl;
}



☆   3  ──────────── 我是分割线 ─────────────────☆
发信人: Jelis (fafa), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Sun Nov 20 21:52:58 2005

感谢~!!!!
   受到启发~~·
            脚踏实地~~~~



☆   4  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Thu Nov 24 20:20:46 2005

建议两点:
第一:get函数最好用bool型,至于原先的返回值用指针或者引用
如:BOOL get(int* data);
或者BOOL get(int &data);
调用就可以这样做:
对应第一种情况:
int a;
xx.get(&a);
对应第二种情况:
int a;
xx.get(a);
第二:指针最好再释放后,再次赋值为NULL;
如:
int* a=(int*)malloc(4*4);//分配4个整数的空间
free(a);
a=NULL;
上面这样做最好,我们不能一定指望free或者delete释放指针指向的存储空间后再自身删除
,我个人习惯是能够自己做的,就做。



☆   5  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Thu Nov 24 20:22:50 2005

呵呵,在调用的时候写错了,应该改成if(xx.get(a) == TRUE){
 //add your codes here}




☆   6  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月25日10:37:28 星期五

1. 建议看看stl stack的实现。

2. C++最好不要用malloc, free,因为malloc, free没有destructor的概念。

3. 自己写的类最好加个名字空间来限制,一来可以方便管理,还可以避免冲突。

建议两点:
第一:get函数最好用bool型,至于原先的返回值用指针或者引用
如:BOOL get(int* data);
或者BOOL get(int &data);
调用就可以这样做:
对应第一种情况:
int a;
xx.get(&a);
对应第二种情况:
int a;
xx.get(a);
第二:指针最好再释放后,再次赋值为NULL;
如:
int* a=(int*)malloc(4*4);//分配4个整数的空间
free(a);
a=NULL;
上面这样做最好,我们不能一定指望free或者delete释放指针指向的存储空间后再自身删除
,我个人习惯是能够自己做的,就做。



☆   7  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Fri Nov 25 14:27:31 2005

你的第三个建议很好,第二个建议我想明确的是,你说的恰好是c++的思想,更为面向对象
,虽然c++不全然是。
但这我认为恰好是c++的优秀之处,面向了计算机。再说,面向对象能不能最好的解决问题
,我个人不认为是。
对象封装的颗粒大小等都是个问题,值得就具体问题,深入研究。
至于第一点,我还没有读过stl实现堆栈的文章,没办法在这讨论。



☆   8  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月28日10:17:05 星期一



我是针对杜绝内存泄露的方面来说的。如果free不知道对象的析构函数这个概念,那么对
象在释放时就很有可能产生内存泄露。但是如果在c++代码中确定不会使用对象的时候,
那就可以使用malloc & free.


我说的是实现的代码,其实就是支持多一些的数据类型而已,不用每种数据类型都写一个
方法或者写一个类。编写代码的时候要考虑到重用性和通用性,这时用stl是比较适合的,
当然如果要使用一些不支持stl那些语法的编译器的时候,也就是考虑到
可移植性(portability)的时候,那就要避免使用stl。

stl使用方便,例如:
要使用一个int类型的stack时,
#include <stack>

using namespace std;
int main()
{
    stack <int> S; //声明
    //压栈
    S.push(6);
    S.push(7);

    if ( S.size() != 2 )
    {
        cerr << "error, stack size incorrect." <<endl;
        return -1;
    }
    //出栈
    S.pop();

    if ( S.size() != 1 )
    {
        cerr << "error, stack size incorrect." <<endl;
        return -2;
    }
    //出栈
    S.pop();
    if ( !S.empty() )
    {
        cerr << "error, stack size incorrect." <<endl;
        return -2;
    }
    return 0;
}

同样如果要使用float类型的stack
那就这样声明:

stack <float> S;

又或者要把一个类放在栈里面:
//把栈里面可以放入food类
class food;
stack <food> S;

//栈里面可以放入point类
class point;
stack <point> S;




☆   9  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Mon Nov 28 16:50:40 2005

[color=blue]我是针对杜绝内存泄露的方面来说的。如果free不知道对象的析构函数这个概
念,那么对
象在释放时就很有可能产生内存泄露。但是如果在c++代码中确定不会使用对象的时候,
那就可以使用malloc & free.[/color]
上面的我没看懂,呵呵
至于下面的stl代码,我想我们不用把stl想的神秘了,看样子stl封装的stack不过就是一个
模板类,
完全可以自己写。
我个人不认为学习譬如mfc,stl,等等是一个重点,他们只是一种帮助你快速实现的手段。
而应该弄清楚每个简单的语句中背后的内涵。




☆  10  ──────────── 我是分割线 ─────────────────☆
发信人: John (处女座的男人), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月28日16:57:40 星期一


   nod!!




☆  11  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月28日17:40:14 星期一



去看看Effective C++(2nd edition)里面的
Item 3: Prefer new and delete to malloc and free.
的详细解释就知道为什么了.


STL本来的意思就是Standard Template Library的意思.


只要写得比gcc或者vc的stl实现好的话,自己写也没问题.


没人说这个是重点.




☆  12  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Mon Nov 28 18:03:19 2005

你说的析构遇到的困难,是不是指的是free不知道释放多少内存空间?譬如某个对象里面又
有指针,free则只能释放对象本身,而对象里面指向的指针,所指向的存储空间没有释放.

就这一点来说,使用free还是delete都应该注意这个问题。
ps:我没有说malloc比new好,free比delete好,我的意见是把所有的东西都暴露出来,大
家讨论。
第二点:我也没有排斥stl,我的意思是同上面所说的一样,对于初学者或者懵懵懂的人来说
,stl,或者mfc,甚至c++里面的一些常用的函数屏蔽了太多细节,过多的去注意stl,mfc使
用,
可能会得不偿失。这是我的意见。

--

※ 来源:.荔园晨风BBS站 http://bbs.szu.edu.cn [FROM: 192.168.100.226]

※ 修改:.blackhawk 於 Nov 28 18:13:53 2005 修改本文.[FROM: 192.168.100.226]

☆  13  ──────────── 我是分割线 ─────────────────☆
发信人: bakey (sbb的猪), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月28日18:20:26 星期一



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~这个同意,虽然用起来方便,不过最起码要在知道其原理的前提下使


☆  14  ──────────── 我是分割线 ─────────────────☆
发信人: FineBoy (FineBoy), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日08:53:28 星期二



     对象里面的指针所指向的内存当然要自己管理,delete也帮不了你,free和delete
的区别不在这,而是delete会调用对象的析构函数,free不会,new和malloc同理,
new会调用构造函数malloc不会。这样在析构函数所做的一些清理工作在用free时就不会执
行。


☆  15  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日09:40:28 星期二

//nod 我的意思就是这个



     对象里面的指针所指向的内存当然要自己管理,delete也帮不了你,free和delete
的区别不在这,而是delete会调用对象的析构函数,free不会,new和malloc同理,
new会调用构造函数malloc不会。这样在析构函数所做的一些清理工作在用free时就不会执
行。


☆  16  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日10:10:21 星期二

建议先看看我说的那本书里面的说明再讨论。那里面说明了何时使用new, delete,何时
使用malloc, free,我要强调的是,里面也没有说哪个好,只是说了在什么情况下用什么
而已。


这个似乎是你自己过分强调了,我只是介绍一种实现栈的可参考的办法而已,我仅仅是提
供一种新思路(对于熟悉这个的人或许已经是很old的思路)。

看来有必要强调一下我的观点和我对新事物的做法:
我喜欢尝试新的东西,并且用于实践中。
但是我认为:不熟悉的就最好不要用在实际产品中,宁愿用最原始最有保障的方法。
新的方法可以去试,当确认这个方法不会出现问题,并且要比原来的方法有效的时候才去
用到实际产品中。(可见条件是多么苛刻)



☆  17  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日10:13:44 星期二

by the way: 看看我的说明档的那五条。

建议先看看我说的那本书里面的说明再讨论。那里面说明了何时使用new, delete,何时
使用malloc, free,我要强调的是,里面也没有说哪个好,只是说了在什么情况下用什么
而已。


这个似乎是你自己过分强调了,我只是介绍一种实现栈的可参考的办法而已,我仅仅是提
供一种新思路(对于熟悉这个的人或许已经是很old的思路)。

看来有必要强调一下我的观点和我对新事物的做法:
我喜欢尝试新的东西,并且用于实践中。
但是我认为:不熟悉的就最好不要用在实际产品中,宁愿用最原始最有保障的方法。
新的方法可以去试,当确认这个方法不会出现问题,并且要比原来的方法有效的时候才去
用到实际产品中。(可见条件是多么苛刻)



☆  18  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 12:43:24 2005

析购函数在没有函数实体的时候,是按位求反,如果没有定义析构函数,则编译器帮你自动
生成,是空的。
c++之所以引入new,delete等等,因为它是面向对象的,它必须防止人们利用new,delete时
所忽视的问题。
恕我大胆地说,在本质上,delete就是free.
我们不要忘记,c++是c的超类,最本质上的东西就是c,什么面向对象等等都是面向用户的!
!而不是它
创新出了一个什么新花样,不过就是多了一小层。




☆  19  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 12:46:30 2005

我的意思正是如此。费劲的说这么多,只是为了阐述清楚问题,将细节一一暴露。




☆  20  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日14:23:19 星期二



更准确来说应该C++是ANSI C的超集才对。




☆  21  ──────────── 我是分割线 ─────────────────☆
发信人: FineBoy (FineBoy), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日14:47:41 星期二


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
怎么得出的结论?new和delete是运算符,而malloc和free不是,怎么会本质上一样?
new和delete在编译器的控制之内,malloc和free不在。

一个是过程编程,一个是对象编程,学c++应该从c中脱离出来。



☆  22  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 16:07:00 2005

不错,一个是过程,一个是对象,但是对象是由过程组成的,我说的本质就是这个意思.
至于new,delete是运算符,运算符只是抽象上的概念,和本质不矛盾。
new和delete在编译器的控制之内,没错,但是编译器是怎么控制的?它聪明了还是你设计n
ew,delete时多考虑了一些?如果是设计new,delete的人多考虑了一些,那他为什么要这么
做?要解决的问题是什么?
可以说,就是因为c++的面向对象。有了对象,自然有构造,有构造自然有析构,这是对象
生存和销毁,
但是对象(我说的不是类)最终在物理上不过是一个占了一些空间的存储区域,请问具体到

间的释放上delete和free有什么区别?这个时候已经没有对象,脱了衣服的delete和free他

各自是怎么干活的?


--

※ 来源:.荔园晨风BBS站 http://bbs.szu.edu.cn [FROM: 192.168.100.226]

※ 修改:.blackhawk 於 Nov 29 16:12:45 2005 修改本文.[FROM: 192.168.100.226]

☆  23  ──────────── 我是分割线 ─────────────────☆
发信人: FineBoy (FineBoy), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日16:25:36 星期二

正因为new和delete是运算符在编译器控制之内,才可以做malloc和free不能做的事情。
虽然new和malloc在物理上都是占了一些空间的存储区域,
但是你要知道new是在free store分配,malloc是在heap分配的,本质上是不一样的,所以
即使把他们的衣服脱了,他们干的活还是不一样的。
。我不知道你所说的new和free本质上一样是怎样得出的结论?



☆  24  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日16:45:53 星期二


[jjksam]这个我也不同意blackhawk的观点,new,delete的引入是因为构造函数和析构函数
的引入同时也是由于面向对象概念引入而引入的。

另外要注意的就是,C++并没有对new,delete的实现方法做规定,但是对对象在内存中的
模型是有约束的。

我再详细的解释一下,包括C++的历史:
malloc与free是C/C++的标准库的函数,new,delete是C++的运算符。它们都可用于申
请动态内存和释放内存。

对于非内部数据类型的对象,malloc,free无法满足产生和删除动态对象的需要,对象在
创建的时要自动调用该对象的构造函数,对象在消亡之前要调用该对象的析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内(正如FineBoy所说)
,不能够把执行构造函数和析构函数的任务强加于malloc,free。

因此,C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理
与释放内存工作的运算符delete。注意:new,delete并不是库函数。

所以我们不要企图用malloc,free来完成动态对象的内存管理,应该用new,delete。由于
内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc,free和new,delete
是一样的。

接下来应该有人又会问,既然new,delete的功能完全覆盖了malloc,free,为什么C++不
把malloc,free淘汰掉呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc,
free管理动态内存。

根据C++作者的《The Design and Evolution of C++》的2.11.2和3.9中所说,C++的new
操作符和new的实现模型是从Simula那里borrow过来的。
但delete就不是从Simula那里借过来的了,因为作者说,发现Simula的GC机制不适合在
函数库的层面上实现,并且他发现在每个类都有一个分配器(allocator)和清除器
(deallocator)时,效率可以得到提高并且可以减少内存碎片.



[jjksam] 是确实要和其他语言脱离开来,但是有些概念的东西还是不能丢,例如,变量,
数组,输入,输出等概念。可以看看Bjarne Stroustrup的FAQ,

http://www.research.att.com/~bs/bs_faq.html#prerequisite

这里面介绍了一篇文章,是关于在早期的学习中如何构造C++程序,如何选择技巧和库的问

http://www.research.att.com/~bs/new_learning.pdf




☆  25  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 16:46:21 2005

freestore,通常就是heap,一个是c++叫法,一个是c叫法。
同时,free store这个概念是强调了c++对于heap的管理,
我说的free和delete区别,如果当我们new=malloc时,就是一样的。
而new为什么不等于malloc,则是new引入了对象概念,加了类型,数据对齐等等描述性头部
信息。
不知道你看过汇编代码没有,在调试到了释放内存的时候,free和脱光了衣服的delete区别
仅在于寻址,和寻多少址的问题。


--

※ 来源:.荔园晨风BBS站 http://bbs.szu.edu.cn [FROM: 192.168.100.226]

※ 修改:.blackhawk 於 Nov 29 16:51:57 2005 修改本文.[FROM: 192.168.100.226]

☆  26  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 16:50:23 2005

我把我说的本质概念解释下,我说的本质是,脱光了衣服的delete和free就是释放内存的,
这是最本质的东西



☆  27  ──────────── 我是分割线 ─────────────────☆
发信人: mmkiller (傢有小魔), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日16:50:58 星期二


 插句嘴,据闻new也是在堆分配。各位继续。




☆  28  ──────────── 我是分割线 ─────────────────☆
发信人: FineBoy (FineBoy), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日16:58:34 星期二


                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
肯定不是叫法上的区别了,malloc从heap分配,如果heap用完了,就从free store里取资
源组成heap,之所以要组成heap是因为heap是有结构的,而free store不是。



☆  29  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日16:58:46 星期二

我基本同意你的观点,但是有一点不同意,C++和C一样,对象使用的存储空间可以使用3
种方法来分配,栈(自动存储)--stack ( atomatic storage ),固定地址(静态存储),
另外还有就是你说的动态存储(堆)-- free store ( on the heap, dynamic storage ).

C的动态分配只有一种方法,即malloc,而且malloc无法保证产生对象时可以调用到该对象
的constructor,即无法完成初始化(initialization),而new在使用时就调用了某些分配
内存的函数为该对象分配所需内存,同时还调用了该对象的constructor去初始化另外那些
内存.这个过程通常这叫做对象的实例化或者对象的创建.这并不是C所有的特性,而是我
之前那篇文章所说的是从Simula语言那里借用过来的.

正因为new和delete是运算符在编译器控制之内,才可以做malloc和free不能做的事情。
虽然new和malloc在物理上都是占了一些空间的存储区域,
但是你要知道new是在free store分配,malloc是在heap分配的,本质上是不一样的,所以
即使把他们的衣服脱了,他们干的活还是不一样的。
。我不知道你所说的new和free本质上一样是怎样得出的结论?



☆  30  ──────────── 我是分割线 ─────────────────☆
发信人: FineBoy (FineBoy), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日16:59:36 星期二

有些编译器是,与编译器有关,所以为了程序的移植性,最好区分开。



☆  31  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:07:38 星期二


类型和数据对齐在C里面也是同样有的.可以比较一下C和C++的struct,new的概念核心并
不是这些.


那你还不如说到了机器那还不是0101的东西,这不叫本质吧.
还是不理解你说的本质是什么.




☆  32  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 17:08:16 2005

我一直提出的观点,是基于最底层的东西,是基于内存管理层面上的,没有引入对象这个概
念,
如果要引入对象这个概念,则new的含义=对象的内涵+对象引申出来的外延,远远大于mallo
c,实在没啥讨论的。
我一直在强调的是最底层上的东西,讲的是最终内存管理上的区别。




☆  33  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:12:28 星期二

这个就是错的了.delete不只是释放内存(或者更广的概念:释放资源),我想你们都偏
向于释放内存(资源)这个问题上了.
如果我的一个类里面的constructor做的并不只是分配内存呢?
例如:连接网络,然后注册一个网络服务,
那么我在这个对象的destructor中写的是:
注销网络服务,断开网络.

那么free就不能做到delete所能做到的东西了.

如果从广义来说:释放资源也包括释放注册了的网络服务,那么free也不能做到.

我把我说的本质概念解释下,我说的本质是,脱光了衣服的delete和free就是释放内存的,
这是最本质的东西



☆  34  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 17:14:36 2005

new和malloc面向的问题都不一样,如果要比较,只能在存储空间的分配和释放上讨论,而
在这个层面上,去除new
的头部信息,那么两者还有什么区别?
0101有时也可以考虑,看看问题要分析到什么程度。
至于这个头部信息,牵涉到对象,而对象的抽象类我们没有定义,所以不好讨论,我随便的
说了几个。



☆  35  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:16:14 星期二

free store 即 heap,
请参考C++作者Bjarne Stroustrup写的<<The Design and
Evolution of C++ >> 2.11.2 Allocations and Constructors 的第二行.

题外话:奇怪我怎么突然输入不了书名号的?




☆  36  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:17:45 星期二


在没有引入对象的情况下,delete和free本质也是不同的.

我一直提出的观点,是基于最底层的东西,是基于内存管理层面上的,没有引入对象这个概
念,
如果要引入对象这个概念,则new的含义=对象的内涵+对象引申出来的外延,远远大于mallo
c,实在没啥讨论的。
我一直在强调的是最底层上的东西,讲的是最终内存管理上的区别。




☆  37  ──────────── 我是分割线 ─────────────────☆
发信人: mmkiller (傢有小魔), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:17:58 星期二

回题外话:因为你用了全角输入.如果是紫光,请尝试Shift+Space切换.




☆  38  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:20:10 星期二

回题外话回话:果然,thx



☆  39  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 17:23:06 2005

区别何处?



☆  40  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:25:44 星期二

确实是有区别,不过这两个是否有关联,根据C++ Draft,还没有说哪个在哪个分配

看这里
摘自:http://www.gotw.ca/gotw/009.htm

Note about Heap vs. Free Store: We distinguish between "heap" and "free store"
because the draft deliberately leaves unspecified the question of whether
these two areas are related. For example, when memory is deallocated via
operator delete, 18.4.1.1 states:

It is unspecified under what conditions part or all of such reclaimed storage
is allocated by a subsequent call to operator new or any of calloc, malloc,
or realloc, declared in <cstdlib>.

Similarly, it is unspecified whether new/delete is implemented in terms of
malloc/free or vice versa in a given implementation. Effectively, the two
areas behave differently and are accessed differently -- so be sure to use
them differently!

】 : freestore,通常就是heap,一个是c++叫法,一个是c叫法。
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
肯定不是叫法上的区别了,malloc从heap分配,如果heap用完了,就从free store里取资
源组成heap,之所以要组成heap是因为heap是有结构的,而free store不是。



☆  41  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:26:50 星期二

不好意思,查了一下资料,我修正一下,"heap"和"free store"确实是两个不同的概念。




☆  42  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:28:04 星期二

3342答了




☆  43  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:30:21 星期二

再强调一点,没必要比较他们的本质,只要明白他们做了什么就可以了。

还有,不讲对象的话,delete也就没必要去比较了,因为delete存在,有使用价值的地方
就是删除一个对象并做一些对象销毁的工作。




☆  44  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:31:22 星期二

内存管理没什么必要去比较。各种OS和各种编译器有不同的实现,比也比不了。




☆  45  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:32:19 星期二


如果是想你这样说的话,根本就不用比,不同的东西比较也毫无价值。




☆  46  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 17:34:58 2005

3342引入了对象。
话题说的大一点,c++抛开对象,就是c,c是因为要面向对象才演化成c++.
再说一遍:我现在说的问题是抛开对象的delete和free的区别。
所有的文章讲的都是两者如何如何不同,但是当没有对象时,不同在何处?




☆  47  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:38:28 星期二

再强调一下,没有对象,delete也没有价值,所以不需要比较。

3342引入了对象。
话题说的大一点,c++抛开对象,就是c,c是因为要面向对象才演化成c++.
再说一遍:我现在说的问题是抛开对象的delete和free的区别。
所有的文章讲的都是两者如何如何不同,但是当没有对象时,不同在何处?




☆  48  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 17:39:53 2005

不能这样说,至少我们可以知道了他俩在内存分配和释放上的区别。



☆  49  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:48:20 星期二


非数学概念上来说ANSI C是C++的子集,但不可以说,C++排除对象这个特性后就是
ANSI C,因为C++的许多特性都不是从ANSI C那里来的。

C++和C99之间的比较就更不用说了。




☆  50  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:49:07 星期二

可以有区别,也可以没有区别,编译器的实现不尽相同。




☆  51  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:57:50 星期二

我们在学习一种语言的时候,更多的是去学习这种语言的特性,更多的是去学习而不是钻
牛角尖去比较一种语言和另外一种语言的区别,虽然比较有时可以加强我们对某种语言的
理解。

其实我们讨论到这里已经都清楚malloc/free和new/delete都是可以在C++里面使用的,
至于什么时候使用什么,要根据具体情况来确定,还有一点就是malloc/free和new/delet
e不能混着用,这些我想大家都是知道的。




☆  52  ──────────── 我是分割线 ─────────────────☆
发信人: jjksam (VOIP engineer), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: 2005年11月29日17:59:30 星期二

那你说有什么区别呢?比较出来这个区别又有什么意义?

不能这样说,至少我们可以知道了他俩在内存分配和释放上的区别。



☆  53  ──────────── 我是分割线 ─────────────────☆
发信人: blackhawk (blackhawk), 信区: Program
标  题: Re: 编写一个类,实现简单的栈
时  间: Tue Nov 29 18:14:30 2005

意义在于大家使用时,心里很清楚,不用提心掉胆。
※ 修改:·bakey 於 11月30日17:39:20 修改本文·[FROM: 192.168.111.149]
我想编程的人最忌讳的也是这点。
※ 修改:·bakey 於 11月30日23:30:12 修改本文·[FROM: 192.168.111.149]
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.111.149]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店