VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1004|回复: 8

动态创建的字符串数组,怎样释放内存??

[复制链接]

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-25 21:40:01 | 显示全部楼层 |阅读模式

char **Buffer=new char*[1000];


用 delete Buffer; 或 delete []Buffer; 好像释放不了
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-2-15 21:45:01 | 显示全部楼层
delete []Buffer是对的,你的误区在于,你认为释放以后,
Buffer的值应当对应于一种“释放了的”状态

但世纪上,作为一个指针,它的表现方式只是一个整数(或类似的东西),
这个整数标明了变量或者数组在内存中的地址(物理地址或者虚拟地址),
在这个指向的地址的内容被释放以后,这片内存已经不能再去访问了,除非
另外一个指针指向了它。

但你的指针变量不是这样的,它还是保留这一个整数,对应于某个地址,
但你不用担心,指向的那块内存已经被正确释放了

好的风格是,在你delete []buf;以后,你写上buf=0,这样可以避免一些
不必要的混淆
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-2-15 22:15:02 | 显示全部楼层
上面有句话不太准确,第二段最后一句,应是:这个指向的地址的内容被释放以后,
这片内存已经不能再去访问了,除非被重新分配,并且用另外一个指针指向了它。
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-2-16 00:15:01 | 显示全部楼层
谢谢verance,使用任务管理器中监视内存,用Buffer来存储读取的文本文件的内容,读取10MB的文件,delete []Buffer;Buffer=NULL;后发现内存仍未释放。

这是为什么?
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-2-16 07:45:01 | 显示全部楼层
BCB的TStringList 效率很低,文件大时十分明显
把内容转存到Buffer中


TStringList *List=new TStringList();
List->LoadFromFile("Dir.txt");   
int NCount= List->Count;
char **Buffer=new char*[NCount];

    for(int i=0; i<NCount; i++)
    {
     int len=NetList->Strings[i].Length();
     *Buffer=new char[len+1];
     strcpy(*Buffer, List->Strings[i].c_str());
     **Buffer++;
    }
//

....
//
delete List; //这个可以释放
delete []Buffer; //这好像没起作用

回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-2-22 08:45:02 | 显示全部楼层
你的delete只是把内存从你的程序还给系统堆管理函数。
任务监视器监视的是系统堆管理函数从os申请的内存。
这是2码事呀。
回复

使用道具 举报

0

主题

23

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-3-8 15:30:02 | 显示全部楼层
superandy 说的也许是一种可能,这样的话,就没你的事情了

还有一个可能:
会不会因为你分配了1000个指针以后,再用这一千个指针指向一千个动态分配的内存区域,
而在释放指针数组之前,你没有释放这一千个内存区域,造成泄漏???
回复

使用道具 举报

0

主题

12

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
发表于 2020-3-12 21:30:02 | 显示全部楼层
        char **Buffer=new char*[100];
        for (int i = 0; i < 100; i++) {
                delete Buffer[i];
        }

        delete Buffer;
回复

使用道具 举报

1

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-5-10 09:30:01 | 显示全部楼层
感谢goodjianli,测试成功

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表