乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 135|回复: 9

使用删除...

[复制链接]

4

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-6-15 09:45:04 | 显示全部楼层 |阅读模式
我是c++新手……
我应该用“删除”来表示“saida”吗
如果我将删除添加到saida,则它不起作用;在fclose()之后,…
  1. void EFernal_ReadFile (char *nome)
  2. {
  3.         FILE *fp = NULL;
  4.         if (fopen_s(&fp, nome, "r") != 0)
  5.         {
  6.                 sds_alert(L"Erro:\n\n\n\tNão foi possível abrir o arquivo para leitura...");
  7.                 sds_retvoid();
  8.                 return;
  9.         }
  10.         char linha[255] = "";
  11.         wchar_t *saida = new wchar_t[255];
  12.         while(!feof(fp))
  13.         {
  14.                 fgets(linha, 254, fp);
  15.                 if((strlen(linha) > 5) && (linha[0] != ';'))
  16.                 {
  17.                     saida = CA2W(linha);
  18.                         sds_alert(saida);
  19.                 }
  20.         }
  21.         fclose(fp);
  22.         Arquivo_Chm = CA2W("D:\\PlanetaCad_Loel\\PlanetaCAD_Loel.chm");
  23.         Help();
  24.         sds_retvoid();
  25. }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

4

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-6-15 19:30:27 | 显示全部楼层
是的,在这种情况下,您应该使用delete[]。
你也有可能使用悬空指针,就像你所说的在循环内部赋值一样
回复

使用道具 举报

4

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-6-15 19:39:14 | 显示全部楼层
好的,谢谢。。。
我只使用删除,而不是删除[]...
回复

使用道具 举报

4

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-6-15 19:51:23 | 显示全部楼层
这一行是错误的代码1]
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2011-6-15 22:31:36 | 显示全部楼层
它起作用了...
正确的方法是什么?
  1. saida = CA2W(linha);

回复

使用道具 举报

4

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-6-16 11:45:00 | 显示全部楼层
它的指针101。如果您为指针分配一个新值,您如何对其调用删除?
示例:
  1. wchar_t *saida = new wchar_t[255];

现在saida的地址指向内存中的一个位置...说0x123456。现在您调用:
  1. saida = CA2W(linha);

它为saida分配了一个新地址,因此saida现在可能指向0x123659。
现在您想调用删除来释放您在0x123456处创建的内存,
但是等等...你不能,因为siada现在指向0x123659。
所以现在您有一个“内存泄漏”
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2011-6-16 14:35:51 | 显示全部楼层
这是一个测试,只是为了学习...
我把它改成了:
  1. void EFernal_ReadFile (char *nome)
  2. {
  3.         FILE *fp = NULL;
  4.         if (fopen_s(&fp, nome, "r") != 0)
  5.         {
  6.                 sds_alert(L"Erro:\n\n\n\tNão foi possível abrir o arquivo para leitura...");
  7.                 sds_retvoid();
  8.                 return;
  9.         }
  10.         char linha[255] = "";
  11.         while(!feof(fp))
  12.         {
  13.                 fgets(linha, 254, fp);
  14.                 if((strlen(linha) > 5) && (linha[0] != ';'))
  15.                 {
  16.                         sds_alert(CA2W(linha));
  17.                 }
  18.         }
  19.         fclose(fp);
  20.         sds_retvoid();
  21. }

它正在工作...
这是正确的吗?
感谢您的帮助...
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2011-6-16 19:30:53 | 显示全部楼层
更好
回复

使用道具 举报

4

主题

45

帖子

4

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2011-6-17 13:47:51 | 显示全部楼层

while语句是错误的形式,如果fp上出现错误标志,则可能会出现无限循环。最好检查fgets是否返回NULL,然后再检查fp中是否出现错误标志。
[6]
此外,对linha和fget使用相同的缓冲区分配大小。既然您在ARX组中发布了此消息,我假设您正在使用C++。因此,养成使用命名空间的习惯并删除EFernal_前缀。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2011-6-20 08:31:30 | 显示全部楼层
谢谢你,我会这样学习的...
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 16:52 , Processed in 0.233478 second(s), 83 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表