c++ - 内存泄漏 - STL 集

标签 c++ stl set memory-leaks

我正试图堵住我所有的内存泄漏(这是巨大的)。我是STL的新手。我有一个类(class)图书馆,里面有 3 套。我还在库类中使用 new 创建了大量内存,用于将信息添加到集合中......

我需要取消分配集合吗?如果是,怎么办?

这是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

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;

}

在库类中,我创建了大量内存,但析构函数没有清理掉它吗? 示例:

    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);

注意:我没有拷贝构造函数。我不确定我是否需要一个或如何添加一个。我也不认为我的析构函数会被调用..

最佳答案

STL 容器不是为保存指针而设计的。

查看升压指针容器。这些容器旨在容纳指针。

#include <boost/ptr_container/ptr_set.hpp>
#include <boost/ptr_container/ptr_map.hpp>

http://www.boost.org/doc/libs/1_42_0/libs/ptr_container/doc/ptr_set.html

容器持有并拥有指针,因此当容器超出范围时它们将被删除。但容器的美妙之处在于您可以通过引用访问对象,因此所有标准算法都可以在没有任何特殊适配器的情况下工作。

typedef boost::ptr_set<Item>              ItemSet;
typedef boost::ptr_map<string,Item>       ItemMap;
typedef boost::ptr_map<string,ItemSet>    ItemSetMap;

附言。很难准确判断,但看起来您的接口(interface)中有太多返回指针。在 C++ 中很少实际返回指针(或传递指针)。您的接口(interface)通常应采用对象/引用或智能指针(通常按此顺序但视情况而定)。

使用指针应该是最后的手段,因为没有明确指示对象的所有者,因此清理成为问题(从而导致大量内存泄漏)。

关于c++ - 内存泄漏 - STL 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2394529/

相关文章:

c++ - 在 STL 中使用返回索引进行二进制搜索?

c++ - std::any_cast 不需要原始对象的类型

c++ - 为什么 std::string 操作表现不佳?

c++ - Cocos2d-x 缺少 sys/socket.h

c++ - 将结构链表添加到数组会产生错误

c++ - 列表迭代器不可取消引用?

java - 计算两个集合之间的交集最有效的方法是什么(Java)?

string - 提取字符串表达式表示的所有可能的字符串集(汤普森构造的一部分)

set - 向集合中添加新元素

c++ - 如何摆脱警告 : Implicit conversion shortens 64-bit value into a 32-bit value