• 全部
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

C++基础问题.

binbin 2004-04-06 01:33:32
char* pChar=new char[100];
...
delete [] pChar;

C++编译器是如何知道pChar分配的内存的大小并正确释放呢?
还有,如果我使用内存池,在中间内存池不够大进行了多次内存的重新分配,最后怎么保证内存正确释放掉呢?

问题是出在我写的一个插件,让一种不支持自定义数据类型的脚本语言能实现类似c/c++的struct的数据类型,要对用户脚本生成的自定义结构进行内存管理,发现重复运行有微小的内存使用增量产生,测试时循环生成,读写成员和释放一个结构体大约6个小时,内存增加了200k左右,不知道是不是发生了内存泄漏,但可以保证的是每个new在逻辑上都有对应的delete, codeguard捕捉不到任何错误.
...全文
75 点赞 收藏 46
写回复
46 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
BCBX 2004-06-30
只是想知道:
delete [] pChar;
是如何知道要释放多少内存空间呢?

这个是编译器它的责任!! 它自己能知道是多少!! 如果你想了解的话就要看C++内存对象模型的书啦 ! 这个你放心用吧!! 它知道知自己当前的是多少
回复
xrdsheng 2004-06-30
此贴怎么沉了这么久,UP 一下
回复
oyxiaoyu0 2004-06-30
而你的N初始值是100,所以n-100后也是100,也看不出什么错误了
回复
oyxiaoyu0 2004-06-30
int n=100;
char* pChar=new char[n];
...
n+=100;
char* pChar1=new char[n+100];//重新分配
memcpy(pChar1,PChar,n-100);//复制到新位置
//这里为什么大小不是n呢,把原来分配的大小为n的内存拷贝到新的位置中啊。
delete [] pChar;//释放旧内存
pChar=pChar1;//指向新位置
...
delete [] pChar;
回复
MEFULEU 2004-06-30
//咳;有这么麻烦吗?

int n=100;
char* pChar=new char[n];
char *tmp;

memset(pChar,'k',n); //假设此为使用过程

tmp=pChar; //保存此地址

if (pChar!=NULL) delete []pChar; //删除指针

pChar=new char [n+100]; //重新分配

memcpy(pChar,tmp,100); //重新得到原始值;


...

delete [] pChar; //删除指针
回复
robbyzi 2004-06-30
使用 p = new t[n] 和 delete[] p:

fred* p = new fred[100];
// ...
delete[] p;
任何时候你通过new 来分配一个对象的数组(通常在表达式中有[n]),则在 delete 语句中必须使用[]。该语法是必须的,因为没有什么语法可以区分指

如果 delete 一个由new t[n]分配的数组,漏了[]会如何?
所有生命毁灭性地终止。

正确地连接new t[n]和delete[] p是程序员的——不是编译器的——责任。如果你弄错了,编译器会在编译时或运行时给出错误消息。堆(heap)被破坏是可能的结果,或者更糟糕,你的程序可能会死

回复
jiangchun_xn 2004-04-08
自己管理内存,你可以用最坏适应算法,因为你有大量的内存重分配(变大)。

很多操作系统或者内存管理的书上都有。
回复
jiangchun_xn 2004-04-08
呵呵,Apache的内存管理是自己做的。
回复
jiangchun_xn 2004-04-07
xiaoshi0(小鱼儿) :
一个大内存的指针指向一块小的,则会发生多删除内存的情况,而现在用了一个小内存的指针指向了大内存的指针,所以会发生内存泄漏
----------------------------------------------------

难道你的意思是“指针变量”标志着内存信息???什么叫做“不同的指针”?这些信息都是编译期信息。

内存释放是以地址本身来确定的。她会根据地址查找一张表来确定是哪一块内存,这张表里维护着长度信息和首地址,然后进行一些必要的修改,比如标记为未使用,合并连续地址等。
回复
binbin 2004-04-07
我是查看进程管理器中进程的内存占用发现的,如果有内存泄漏,应该量比较大,因为我试验时每次递增10000次,重复10000次,运行6个多小时才增加200K左右.如果是碎片的原因,不知道如果要做成服务,跑个几天下来不还是要玩完?象Apache这样的软件是怎么处理的呢?
回复
xiaoshi0 2004-04-07
晕,先delete了,内存中的数据不就丢了
首先这样说明一下,如果分配的内存是不连续的,则在分配内存的时候系统会有标志来为不连续的内存设定成连续的,但如果用了不同的指针指向了这个内存,则无法取得这样的信息,就只能指向连续的了,用楼住的方法如果用一个大内存的指针指向一块小的,则会发生多删除内存的情况,而现在用了一个小内存的指针指向了大内存的指针,所以会发生内存泄漏
回复
Persistent8813 2004-04-07
没学过重新分配的问题。为什么不能先DELETE再重新分配?呵,学习。。。
回复
fdw 2004-04-07
你的代码没有错,是产生了内存碎片。你放心。
回复
gangAndgang 2004-04-07
你的代码应该没有错呀,如果运行时间长了出现内存增加现象,应该是产生了内存碎片
不过你是怎么看出你所分配的内存增加了呢?
回复
Persistent8813 2004-04-07
不说明白我谁也不服,呵
回复
xiaoshi0 2004-04-07
你服我干什么,我又没得罪你
我说的不对可以请你指正呀
回复
jiangchun_xn 2004-04-07
我服了小鱼儿。
回复
xrdsheng 2004-04-07
大家可试试,确实没错
我常用这方法释放TList的空间
for(i=0;i<list->Count;i++)
{
void *p=list->Items[i];
delete p; //不用管list里面的指针是什么类型,内存没泄露,我也觉得奇怪,但确实可行
}
回复
guanshangming 2004-04-07
楼主所遇到的问题可能是堆碎片的问题。
回复
xiaoshi0 2004-04-07
服了xrdsheng(xrdsheng)了
回复
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2004-04-06 01:33
社区公告
暂无公告