标题:c++中用new实现c中realloc出错
只看楼主
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
结帖率:95%
 问题点数:0 回复次数:5 
c++中用new实现c中realloc出错
程序代码:
// 0415.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <stdlib.h>

const int nlen = 4;   //分配初始内存大小
const int nadd = 2;   //内存不足,增加内存

struct stack
{
    int *pa;
    int *pb;
    int nsize;
};

void create(stack &s);
void push(stack &s,int e);   //插入元素
void pop(stack &s, int &e);  //删除元素 
bool empty(stack &s);        //判断栈是否为空
void destory(stack &s);       //销毁栈

int main(int argc, char* argv[])
{
    while(1)
    {
        stack sql;
        create (sql);
        
        cout<<"please input a number:"<<endl;
        
        int nt;
        int e ; 
        cin>>nt;

        if(0 == nt)    //当输入0时,退出循环
        {
            return 0;
        }
        
        while(nt)
        {
            push(sql, nt%8);   //10进制数除以8,余数进栈
            nt = nt/8;
        }
        
        while(!empty(sql))    //余数出栈
        {
            pop(sql, e);
            cout<<e;
        }          
        cout<<endl;
        free(sql.pa);
        //system("cls"); 
        
        //delete [] sql.pa;
    }
    return 0;    
}

void create(stack &s)
{
    //s.pa = new int[nlen];
    s.pa = (int *)malloc(nlen * sizeof(int));
    if(!s.pa)
    {
        return ;
    }
    s.pb = s.pa;
    s.nsize = nlen;
}

void push(stack &s, int e)
{
    if(s.pb - s.pa >= s.nsize)
    {
        //delete [] s.pa;
        //s.pa = NULL;
        //s.pa = new int[(s.nsize + nadd)];
        s.pa = (int *)realloc(s.pa,(s.nsize + nadd) * sizeof(int));
        
        if(!s.pa)
        {
            cout<<"memory error!"<<endl;
        }
        s.pb = s.pa + s.nsize;    
        s.nsize += nadd;    
    }
    *(s.pb++) = e;
}

void pop(stack &s, int &e)
{
    if(s.pa == s.pb)
    {
        cout<<"error"<<endl;
    }
    e = *(--s.pb);
}

bool empty(stack &s)
{
    if(s.pa == s.pb)
    {
        return true;
    }
    else 
        return false;
}

void destory(stack &s)
{

}



我的重新分配为什么失败了,求解。另外我发现了一个有趣的事情,就是我把初始分配大小设为10000(大的数字可以看出内存变化),不释放指针,每输入一次数字,该程序占用内存增加40kb,正好1w个int占用的内存大小,可惜无法看到增添内存的变化情况(数值太小)!
搜索更多相关主题的帖子: realloc new 
2010-04-16 23:43
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
你是用的 realloc 失败,还是 new 的?
而且 realloc 还负责拷贝之前的内容到新的地址,你好像也没做类似的事哟。
 
你最后问的那个问题什么意思?你不是看出占用内存变多了吗,怎么说无法看到变化情况?
2010-04-17 10:59
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
得分:0 
realloc,成功了,是new失败了,不会弄,能帮写出new实现的代码吗?
2010-04-17 21:17
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
回复 3楼 最近不在
一般习惯上,就是用 realloc 。或者 memcpy 之类的函数来做这个工作。
你如果想用更 C++ 的方式来做这个,就用 STL。不过其实底层用的也是 memcpy 之类的。
2010-04-25 09:49
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:0 
如果你要用new的话,你应该包含
#include<cstdlib>
using namespace std;

还有,如果你需要处理大量的数据,应该考虑用数据库或者文件,
而不是单纯的去挑战内存的极限,这是不科学的,毕竟内存是十分有限的。

你的代码我在看看有什么问题。

南国利剑
2010-04-25 10:15
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
要用 new 的话,应该包 <new> 这个头文件。
标准说一定要包,不包时可以向下兼容。包了之后,行为会完全符合标准的描述。比如抛出异常什么的。
2010-04-25 18:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-303320-1-1.html




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

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