I have a major amount of memory leaks. I know that the Sets have pointers and i cannot change that! I cannot change anything, but clean up the mess i have...
I am creating memory with new in just about every function to add information to the sets.
I have a Cd/ DVD/book: super classes of ITEM class and a library class..
In the library class i have 2 functions for cleaning up the sets.. Also, the CD, DVD, book destructors are not being called..
here is my potential leaks..
library.h
#pragma once
#include <ostream>
#include <map>
#include <set>
#include <string>
#include "Item.h"
using namespace std;
typedef set<Item*> ItemSet;
typedef map<string,Item*> ItemMap;
typedef map<string,ItemSet*> ItemSetMap;
class Library
{
public:
// general functions
void addKeywordForItem(const Item* const item, const string& keyword);
const ItemSet* itemsForKeyword(const string& keyword) const;
void printItem(ostream& out, const Item* const item) const;
// book-related functions
const Item* addBook(const string& title, const string& author, int const nPages);
const ItemSet* booksByAuthor(const string& author) const;
const ItemSet* books() const;
// music-related functions
const Item* addMusicCD(const string& title, const string& band, const int nSongs);
void addBandMember(const Item* const musicCD, const string& member);
const ItemSet* musicByBand(const string& band) const;
const ItemSet* musicByMusician(const string& musician) const;
const ItemSet* musicCDs() const;
// movie-related functions
const Item* addMovieDVD(const string& title, const string& director, const int nScenes);
void addCastMember(const Item* const movie, const string& member);
const ItemSet* moviesByDirector(const string& director) const;
const ItemSet* moviesByActor(const string& actor) const;
const ItemSet* movies() const;
~Library();
void Purge(ItemSet &set);
void Purge(ItemSetMap &map);
};
here is some functions for adding info using new in library. Keep in mind i am cutting out alot of code to keep this post short.
library.cpp
#include "Library.h"
#include "book.h"
#include "cd.h"
#include "dvd.h"
#include <iostream>
// general functions
ItemSet allBooks;
ItemSet allCDS;
ItemSet allDVDs;
ItemSetMap allBooksByAuthor;
ItemSetMap allmoviesByDirector;
ItemSetMap allmoviesByActor;
ItemSetMap allMusicByBand;
ItemSetMap allMusicByMusician;
const ItemSet* Library::itemsForKeyword(const string& keyword) const
{
const StringSet* kw;
ItemSet* obj = new ItemSet();
return obj;
const Item* Library::addBook(const string& title, const string& author, const int nPages)
{
ItemSet* obj = new ItemSet();
Book* item = new Book(title,author,nPages);
allBooks.insert(item); // add to set of all books
obj->insert(item);
return item;
const Item* Library::addMusicCD(const string& title, const string& band, const int nSongs)
{
ItemSet* obj = new ItemSet();
CD* item = new CD(title,band,nSongs);
return item;
void Library::addBandMember(const Item* musicCD, const string& member)
{
ItemSet* obj = new ItemSet();
(((CD*) musicCD)->addBandMember(member));
obj->insert((CD*) musicCD);
here is the library destructor.....
Library::~Library()
{
Purge(allBooks);
Purge(allCDS);
Purge(allDVDs);
Purge(allBooksByAuthor);
Purge(allmoviesByDirector);
Purge(allmoviesByActor);
Purge(allMusicByBand);
Purge(allMusicByMusician);
}
void Library::Purge(ItemSet &set)
{
for (ItemSet::iterator it = set.begin(); it != set.end(); ++it)
delete *it;
set.clear();
}
void Library::Purge(ItemSetMap &map)
{
for (ItemSetMap::iterator it = map.begin(); it != map.end(); ++it)
delete it->second;
map.clear();
}
so, basically item, cd, dvd class all have a set like this:
typedef set<string> StringSet;
class CD : public Item
StringSet* music;
and i am deleting it like: but those superclasses are not being called.. Item destructor is.
CD::~CD()
{
delete music;
}
Do, i need a copy constructor? and how do i delete those objects i am creating in the library class? and how can i get the cd,dvd, destructor called?
would the addbandmember function located in the library.cpp cause me to have a copy constructor?
Any real help you can provide me to help me clean up this mess instead of telling me not to use pointers in my sets i would really appreciate. How can i delete the memory i am creating in those functions? I cannot delete them in the function!!