모든 메모리 누수를 막으려 고합니다 (방대한). 나는 STL을 처음 사용한다. 3 세트가있는 클래스 라이브러리가 있습니다. 또한 세트에 정보를 추가하기 위해 라이브러리 클래스에 새로운 메모리를 많이 생성하고 있습니다. ...메모리 누수 - STL 세트
세트를 할당 해제해야합니까? 그렇다면 어떻게? 여기
내가 소멸자를 위해 무엇을해야하는지 확실하지 오전 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();
};
입니까?
Library::~Library()
{
}
또한 문자열 세트를 올바르게 할당합니까?
#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
나는 많은 메모리를 만드는 오전 라이브러리 클래스의
#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;
}
cd.cpp하지만 소멸자가 정리 해달라고? 예 :
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);
참고 : 나는 복사 생성자가 없습니다. 나는 심지어 하나가 필요한지 또는 어떻게 최상을 추가하는지 잘 모르겠습니다. 내 소멸자 중 하나라고 불리는 것 같아 ..
짧은 대답 : 코드에서'*'문자의 모든 인스턴스를 검색하고 삭제하십시오. C++에서 포인터를 사용할 필요가 거의 없습니다. 당신이 할 때마다, 당신은 기억 누출을 요구하고 있습니다. – jalf
표준 형식을 사용하는 경우에도 C++에서 포인터를 사용해야하는 경우가 많이 있습니다. – Xorlev
이 경우'Item'은 저장된 객체의 기본 클래스이므로'ItemSet'과'ItemMap'에 포인터를 저장해야합니다. 스마트 포인터를 저장하면 이러한 누수가 수정됩니다. 'ItemSetMap'은 단지 set 객체를 포함해야합니다. –