Really fix: <rdar://problem/8361834> MacroInfo::AddTokenToBody() leaks memory

The problem was not the management of MacroInfo objects, but that when we recycle them
via the MICache the memory of the underlying SmallVector (within MacroInfo) was not getting
released.  This is because objects stashed into MICache simply are reused with a placement
new, and never have their destructor called.

llvm-svn: 116862
This commit is contained in:
Ted Kremenek 2010-10-19 21:30:15 +00:00
parent b865f7e025
commit e75b876fb9
1 changed files with 6 additions and 2 deletions

View File

@ -37,7 +37,7 @@ MacroInfo *Preprocessor::AllocateMacroInfo() {
MacroInfoChain *MIChain = BP.Allocate<MacroInfoChain>();
MIChain->Next = MIChainHead;
MIChainHead = MIChain;
MI = &(MIChainHead->MI);
MI = &(MIChain->MI);
}
return MI;
}
@ -58,7 +58,11 @@ MacroInfo *Preprocessor::CloneMacroInfo(const MacroInfo &MacroToClone) {
/// be reused for allocating new MacroInfo objects.
void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
MICache.push_back(MI);
MI->FreeArgumentList();
// We need to call 'Destroy' as opposed to 'FreeArgumentList' because
// the MICache object will get reused with a placement new. This does
// not cause the underlying SmallVector to get it's memory released, so
// we need to call Destroy() here.
MI->Destroy();
}