c++ primer中的问题(第六章),急啊,在线等!!!

eintain 2004-04-02 11:28:48
c++ primer第六章最后给出的文本查询类中使用了new申请了内存,可是没有用delete回收内存,只是在构造函数中使用下面的语句:
memset(this,0,sizeof(TextQuery));
请问它是怎么回收内存的啊,写了这句话就不用析构函数了吗
百思不得其解啊,高人快指点我呀
...全文
182 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
somedummy 2004-09-03
  • 打赏
  • 举报
回复
好像在后面的部分修改过了这个代码,去看完全版的,应该在第六章最后一节
iwdc 2004-09-03
  • 打赏
  • 举报
回复
我刚看过这一章
可根本就没留意
楼主细心
hkiaipc 2004-09-03
  • 打赏
  • 举报
回复
这个程序确实存在内存泄漏的问题,我在vc6中也发现推出程序后有内存泄漏的提示。可能是作者只是为了举例子把,没有考虑那么多 :)

下面这段代码,加在析构函数中,好像解决了内存泄漏,没怎么仔细试,有兴趣的朋友可以试一下。

delete lines_of_text;
if(text_locations){
delete text_locations->first;
delete text_locations->second;
delete text_locations;
}
if(word_map){
for(map<string,loc*>::iterator iter=word_map->begin();iter!=word_map->end();++iter)
delete iter->second;
delete word_map;
}
freshairfly 2004-09-03
  • 打赏
  • 举报
回复
to iorchis(江楠):

memset(this,0,sizeof(TextQuery));
的意思就是把this指针所指向的内存块所有数据置为0
而这里的this指针指向了一个TextQuery类的实例(即它的非静态成员变量,在这里就是一些指针)

所以memset(this,0,sizeof(TextQuery));这句话就是把TextQuery类的一个实例里的指针置空!
iorchis 2004-09-03
  • 打赏
  • 举报
回复
freshairfly(菜鸟精神)--->我觉得可以啊,如果一个类有好多类成员变量是指针,在构造函数里分别给它们赋值NULL,不如用memset来得快
**************************************************************************

说两句。
赋值NULL是把指针置空,使它不指向任何内存地址。而memset则是设置指针所指内存块的数据,前提则是指针所指的必须是有效的地址。
不知道是不是这样理解!?汗ing.....
freshairfly 2004-09-03
  • 打赏
  • 举报
回复
把 C++ 的 new/delete 内存分配机制与 memset 混合使用的方法很值得质疑。。。至少值得深思
----------------------------------------
我觉得可以啊,如果一个类有好多类成员变量是指针,在构造函数里分别给它们赋值NULL,不如用memset来得快

当然,如果类成员里有其它的非指针(尤其是其它的类对象)成员变量,memset就要慎用了
freshairfly 2004-09-03
  • 打赏
  • 举报
回复
大家有没有注意allocator的使用
我不知道这个类的用法,C++Primer上说
“allocator 类封装了分配和删除动态内存的抽象过程它也是标准库预定义的类实际上它使用了new 和delete。操作符使用这样的分配器类有两个目的通过把容器与内存分配策略的细节分开这可以简化容器类的实现其次程序员有可能实现或者指定其他的内存分配策略比如使用共亨内存”

不知道有没有关系? :(
知行合一2018 2004-04-03
  • 打赏
  • 举报
回复
我看了一下程序,确实没有释放内存。至于memset,是用来将所有成员指针变量初始化NULL的。
Wolf0403 2004-04-03
  • 打赏
  • 举报
回复
把 C++ 的 new/delete 内存分配机制与 memset 混合使用的方法很值得质疑。。。至少值得深思
eintain 2004-04-03
  • 打赏
  • 举报
回复
多谢大家。特别是 davidhopper(疏影横斜) ,看来我是懒惰了点,我刚装的vc7.1把我搞的晕头转向的
再次谢了
zxp2005 2004-04-03
  • 打赏
  • 举报
回复
大家不要纸上谈兵了,虽然我不知道是什么程序,知道的可以调试跟踪一下,看有没有内存泄露呀。同一楼上的。
知行合一2018 2004-04-03
  • 打赏
  • 举报
回复
我刚才调试了一下,存在内存泄漏,应该加上如下析构函数:
~TextQuery() {
delete lines_of_text;
delete text_locations;
delete word_map;
}
zouxueping 2004-04-02
  • 打赏
  • 举报
回复
memset(this,0,sizeof(TextQuery));这句是将申请的内存数据全部置0,内存还是必须释放的。
eintain 2004-04-02
  • 打赏
  • 举报
回复
weixiaohua(我爱Delphi) 说的对;起初我不懂memset(),于是查了手册,知道了memset是初始化内存的,于是更不明白程序中为什么没有delete回收内存了;
高人的书不好随便怀疑啊
所有来请教大家的看法。我都仔细看N +1遍了,也没有看到在哪里回收内存。

编译器一定会回收指针本身占用的内存,但不会回收它所指向的内存(当然是指new分配的),所以会有内存泄漏啊。

我还是想不通为什么没有见到显式的使用delete???????????
郁闷啊!!
weixiaohua 2004-04-02
  • 打赏
  • 举报
回复
没用new分配内存空间的指针变量都由编译器负责清除吧?
凡是用new分配的内存,都需要用delete清除之,这是effectiveC++里说得!
MyClass::MyClass(int ival) : ptr1(0), ptr2(0) //指针变量的初值.
{ }
sunshinee 2004-04-02
  • 打赏
  • 举报
回复
用new申请的内存还需要用memset么?又不是用malloc啊?!
而且我也有个疑问,在C++中是不是在数据成员如果是指针变量,那这个指针的初值在什么地方赋呢?在构造函数中么?
pengzhenwanli 2004-04-02
  • 打赏
  • 举报
回复
真是惭愧。我当年看得时候怎么没有看出来呢。
我确实没有找到内存释放的地方。
eintain 2004-04-02
  • 打赏
  • 举报
回复
怎么会没有new呢,类的成员变量大部分是指针的:
private:
vector<string,allocator> *lines_of_text;
text_loc *text_locations;
map<string,loc*,less<string>,allocator> *word_map;
static string filt_elems;

不用new分配内存怎么有存储空间
还有一些局部变量:
void
TextQuery::
retrieve_text()

//……
lines_of_text = new vector<string,allocator>;
//……


void
TextQuery::
separate_words()
{
vector<string,allocator> *words = new vector<string,allocator>;
vector<location,allocator> *locations = new vector<location,allocator>;
//……


高人们说说见解吧
(我看的电子版的)
vcchunhong 2004-04-02
  • 打赏
  • 举报
回复
大家好
我是新来的
不知道你们说的是什么书
能介绍一下它吗/
我也在学c++
pengzhenwanli 2004-04-02
  • 打赏
  • 举报
回复
我看了一下程序,没有发现使用new分配内存啊!
为什么要是释放。
memset只是将从this开始的内存指针开始,大小为sizeof(TextQuery)的内存块设置为第二个参数的值、

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧