我试图堵塞我所有的内存泄漏(这是巨大的).我是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)
注意:我没有复制构造函数.我不确定我是否需要一个或如何顶部添加一个.我不认为我的析构函数也被称为..
您需要释放集合中每个元素的内存。容器不会为您执行此操作,也不应该这样做,因为它无法知道它是否拥有该数据 - 它可能只是保存指向其他对象所拥有的对象的指针。
这是一个通用的自由函数,可以释放任何 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)
| 归档时间: |
|
| 查看次数: |
6663 次 |
| 最近记录: |