efernal 发表于 2011-6-15 09:45:04

使用删除...

我是c++新手……
我应该用“删除”来表示“saida”吗
如果我将删除添加到saida,则它不起作用;在fclose()之后,…
void EFernal_ReadFile (char *nome)
{
        FILE *fp = NULL;
        if (fopen_s(&fp, nome, "r") != 0)
        {
                sds_alert(L"Erro:\n\n\n\tNão foi possível abrir o arquivo para leitura...");
                sds_retvoid();
                return;
        }
        char linha = "";
        wchar_t *saida = new wchar_t;
        while(!feof(fp))
        {
                fgets(linha, 254, fp);
                if((strlen(linha) > 5) && (linha != ';'))
                {
                  saida = CA2W(linha);
                        sds_alert(saida);
                }
        }
        fclose(fp);
        Arquivo_Chm = CA2W("D:\\PlanetaCad_Loel\\PlanetaCAD_Loel.chm");
        Help();
        sds_retvoid();
}

**** Hidden Message *****

efernal 发表于 2011-6-15 19:30:27

是的,在这种情况下,您应该使用delete[]。
你也有可能使用悬空指针,就像你所说的在循环内部赋值一样

efernal 发表于 2011-6-15 19:39:14

好的,谢谢。。。
我只使用删除,而不是删除[]...

efernal 发表于 2011-6-15 19:51:23

这一行是错误的代码1]

pkohut 发表于 2011-6-15 22:31:36

它起作用了...
正确的方法是什么?
saida = CA2W(linha);

efernal 发表于 2011-6-16 11:45:00

它的指针101。如果您为指针分配一个新值,您如何对其调用删除?
示例:
wchar_t *saida = new wchar_t;
现在saida的地址指向内存中的一个位置...说0x123456。现在您调用:
saida = CA2W(linha);
它为saida分配了一个新地址,因此saida现在可能指向0x123659。
现在您想调用删除来释放您在0x123456处创建的内存,
但是等等...你不能,因为siada现在指向0x123659。
所以现在您有一个“内存泄漏”

pkohut 发表于 2011-6-16 14:35:51

这是一个测试,只是为了学习...
我把它改成了:
void EFernal_ReadFile (char *nome)
{
        FILE *fp = NULL;
        if (fopen_s(&fp, nome, "r") != 0)
        {
                sds_alert(L"Erro:\n\n\n\tNão foi possível abrir o arquivo para leitura...");
                sds_retvoid();
                return;
        }
        char linha = "";
        while(!feof(fp))
        {
                fgets(linha, 254, fp);
                if((strlen(linha) > 5) && (linha != ';'))
                {
                        sds_alert(CA2W(linha));
                }
        }
        fclose(fp);
        sds_retvoid();
}

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

pkohut 发表于 2011-6-16 19:30:53

更好

efernal 发表于 2011-6-17 13:47:51


while语句是错误的形式,如果fp上出现错误标志,则可能会出现无限循环。最好检查fgets是否返回NULL,然后再检查fp中是否出现错误标志。

此外,对linha和fget使用相同的缓冲区分配大小。既然您在ARX组中发布了此消息,我假设您正在使用C++。因此,养成使用命名空间的习惯并删除EFernal_前缀。

pkohut 发表于 2011-6-20 08:31:30

谢谢你,我会这样学习的...
页: [1]
查看完整版本: 使用删除...