内存泄漏 - STL设置

7 c++ memory-leaks stl set

我试图堵塞我所有的内存泄漏(这是巨大的).我是STL的新手.我有一个类库,我有3套.我也在库类中创建了大量内存,用于向集合中添加信息...

我需要解除分配吗?如果是这样,怎么样?

这是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();
};
Run Code Online (Sandbox Code Playgroud)

我不确定我需要为析构函数做些什么?

Library::~Library()
{


}
Run Code Online (Sandbox Code Playgroud)

另外,我正在分配字符串集吗?

    #ifndef CD_H
#define CD_H
#pragma once
#include "item.h"
#include <set>


typedef set<string> StringSet;


class CD : public Item
{
public:

    CD(const string& theTitle, const string& theBand, const int snumber);
    void addBandMember(const string& member);
    const int getNumber() const;
    const StringSet* getMusician() const;
    const string getBand() const;
    virtual void print(ostream& out) const;
    string printmusicians(const StringSet* musicians) const;

    ~CD();


private:

    string band;
    StringSet* music;

    string title;
    int number;

};

ostream& operator<<(ostream& out, const CD* cd);

#endif
Run Code Online (Sandbox Code Playgroud)

cd.cpp

    #include "CD.h"

using namespace std;

CD::CD(const string& theTitle, const string& theBand, const int snumber)
: Item(theTitle), band(theBand),number(snumber), music(new StringSet)
{



}

CD::~CD()
{

    delete []music;

}
Run Code Online (Sandbox Code Playgroud)

在库类中我创建了很多内存,但是析构函数不要清理它吗?例:

    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);
Run Code Online (Sandbox Code Playgroud)

注意:我没有复制构造函数.我不确定我是否需要一个或如何顶部添加一个.我不认为我的析构函数也被称为..

Pet*_*der 3

您需要释放集合中每个元素的内存。容器不会为您执行此操作,也不应该这样做,因为它无法知道它是否拥有该数据 - 它可能只是保存指向其他对象所拥有的对象的指针。

这是一个通用的自由函数,可以释放任何 STL 容器。

template <typename T>
void deallocate_container(T& c)
{
  for (typename T::iterator i = c.begin(); i != c.end(); ++i)
    delete *i;
}

// Usage
set<SomeType*> my_set;
deallocate_container(my_set);
my_set.clear();
Run Code Online (Sandbox Code Playgroud)