Re: Why does this code generate memory leaks?
I just updated the zip file by removing unnecessary files. The project and
memleakdemo.cpp remain unchanged.
For those that don't want to bother downloading the project and just want to
see the code:
// Look at my comments. There are two places where a leak is detected, and
the
// comments show this. Are these real leaks? Does the leak detection
generate
// false leak detections?
// Run this in VS2005 and you will see 3 leaks in the output windows.
// Look at my comments to see the 2 lines to comment out to get rid
// of the leaks.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
#include <set>
#include <string>
using namespace std;
class Item
{
public:
Item( string title ){_title = title;}
void addKeyword(string &keyword){_keywords.insert( keyword );}
private:
string _title;
set<string> _keywords;
set<string> tempstringset;
};
class Book : public Item
{
public:
Book( string title, string author, int nPages ) : Item( title)
{
_author = author;
_pages = nPages;
}
private:
string _author;
int _pages;
// ******* LEAK **********
// This causes a leak, even though we don't actually do anything with it
// Comment this out, and a leak goes away
set<string> tempstringset;
};
class Library
{
public:
~Library();
void addKeywordForItem(Item* item, string keyword){item->addKeyword(
keyword );}
Item *addBook(string title, string author, int nPages);
set<Item*> libraryItemSet;
set<Item*> tempItemSet;
};
//-------------------------------------
Item* Library::addBook(string title, string author, int nPages)
{
Book* b = new Book(title, author, nPages);
libraryItemSet.insert( b );
return b;
}
Library::~Library()
{
// This gets rid of half of the "leaks". This is expected behavior.
for( set<Item*>::iterator iterator = libraryItemSet.begin(); iterator !=
libraryItemSet.end(); iterator++)
delete *iterator;
}
//-----------------------------------------------------------
static Library *library;
int main(int argc, char **argv)
{
Item *item;
// create library instance
library = new Library();
// ******* LEAK **********
// This line causes leak because the second parm is more then 15 charactors
// comment it out and a leak goes away.
item = library->addBook("test1", "1234567890123456", 240);
// This line does not cause leak
item = library->addBook("test2", "test2", 123);
delete library;
_CrtDumpMemoryLeaks();
}