【发布时间】:2012-06-24 08:54:57
【问题描述】:
我已经尝试了一千次以在这个 sn-p 中找到 该死的内存泄漏,但我只是惨败...我正在学习内存分配和这些东西我从来没有能够制作一个可以完全释放它的内存的程序......
我正在调用一个 for 循环来分配 140 个 Contato_s 结构并将它们放入 Agenda std::list。然后我调用另一个 for 循环来使用 RemoverContato 和相应的代码删除所有 140 个联系人... Windows 不会报告单个 Kb 的空闲内存!
struct Contato_s
{
int Codigo;
std::string Nome, Numero, Email, Apelido;
};
std::list<Contato_s*> Agenda;
void CriarContato(std::string Nome, std::string Numero, std::string Email, std::string Apelido) // Add a contact to the list
{
Contato_s *temp = new Contato_s; // Criando um contato temporario
temp->Nome = Nome;
temp->Numero = Numero;
temp->Email = Email;
temp->Apelido = Apelido;
temp->Codigo = Agenda.size()+1;
Agenda.push_back(temp); // Adicionando o contato a lista
}
int RemoverContato(int Codigo) // Delete a contact from the list
{
for (std::list<Contato_s*>::iterator i = Agenda.begin(), e = Agenda.end(); i != e;)
{
if((*i)->Codigo == Codigo)
{
delete (*i);
i = Agenda.erase(i);
return 1;
} else {
++i;
}
}
return 0;
}
提前致谢:)!
--编辑
好的,这就是我试图销毁联系人的方式:
for(int i=0; i<140; ++i)
{
if(RemoverContato(1+i) == 0)
std::cout << "Fail removing contact " << i << std::endl;
else
std::cout << "Contact " << i << " removed" << std::endl;
}
(Ofc 我总是得到“联系人 X 被删除”并且在该部分没有失败,因此理论上正在找到联系人)
【问题讨论】:
-
嗯,您是否为列表中的每个元素调用
RemoverContato?如果你不显示你是如何调用这段代码的,那么我们就没有什么可以告诉你的了(除了std::list<Contato_s*>而不是std::list<Contato_s>是不必要的愚蠢)。 -
你需要展示你是如何调用
RemoverContato的。 9 -
您所说的一切都表明内存已泄漏。物理内存由操作系统管理,并且在其他地方需要时始终可以重复使用。虚拟内存是每个进程的,因此不能“返回”。我认为该错误只是您的期望——期望一个进程将虚拟内存返回给系统(这没有任何意义,因为虚拟内存是每个进程的)。
-
丢失原始指针,改用智能指针。
-
这个想法是使用原始指针来学习内存分配,所以我认为在这里只使用一些更高级别的抽象是没有意义的:)
标签: c++ memory-management memory-leaks stdlist