使用删除...
我是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 ***** 是的,在这种情况下,您应该使用delete[]。
你也有可能使用悬空指针,就像你所说的在循环内部赋值一样 好的,谢谢。。。
我只使用删除,而不是删除[]... 这一行是错误的代码1] 它起作用了...
正确的方法是什么?
saida = CA2W(linha);
它的指针101。如果您为指针分配一个新值,您如何对其调用删除?
示例:
wchar_t *saida = new wchar_t;
现在saida的地址指向内存中的一个位置...说0x123456。现在您调用:
saida = CA2W(linha);
它为saida分配了一个新地址,因此saida现在可能指向0x123659。
现在您想调用删除来释放您在0x123456处创建的内存,
但是等等...你不能,因为siada现在指向0x123659。
所以现在您有一个“内存泄漏”
这是一个测试,只是为了学习...
我把它改成了:
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();
}
它正在工作...
这是正确的吗?
感谢您的帮助... 更好
while语句是错误的形式,如果fp上出现错误标志,则可能会出现无限循环。最好检查fgets是否返回NULL,然后再检查fp中是否出现错误标志。
此外,对linha和fget使用相同的缓冲区分配大小。既然您在ARX组中发布了此消息,我假设您正在使用C++。因此,养成使用命名空间的习惯并删除EFernal_前缀。 谢谢你,我会这样学习的...
页:
[1]