首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内存泄漏- STL集

内存泄漏- STL集
EN

Stack Overflow用户
提问于 2010-03-07 07:44:18
回答 7查看 7.1K关注 0票数 7

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

我需要重新分配这些集合吗?如果是这样的话,是怎么做的?

这里是library.h

代码语言:javascript
复制
    #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();
};

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

代码语言:javascript
复制
Library::~Library()
{


}

另外,我取消分配字符串集是对的吗?

代码语言:javascript
复制
    #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

代码语言:javascript
复制
    #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;

}

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

代码语言:javascript
复制
    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);

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-07 07:58:53

您需要为集合中的每个元素释放内存。容器不会为您做到这一点,它也不应该这样做,因为它不知道自己是否拥有这些数据--它可能只是持有指向其他对象的指针。

这是一个通用的释放函数,它将释放任何STL容器。

代码语言:javascript
复制
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();
票数 3
EN

Stack Overflow用户

发布于 2010-03-07 08:55:40

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

看看boost指针容器。这些容器被设计用来保存指针。

代码语言:javascript
复制
#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

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

代码语言:javascript
复制
typedef boost::ptr_set<Item>              ItemSet;
typedef boost::ptr_map<string,Item>       ItemMap;
typedef boost::ptr_map<string,ItemSet>    ItemSetMap;

PS。很难准确判断,但看起来你的接口返回了太多的指针。在C++中实际返回指针(或传递指针)的情况非常少见。您的接口通常应采用对象/引用或智能指针(通常按此顺序,但这取决于具体情况)。

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

票数 4
EN

Stack Overflow用户

发布于 2010-03-07 07:48:33

我没有检查过所有的代码,但是从最初的几行代码看,您似乎在维护一组指针。当你有一个保存指针的STL容器,并且你使用new把东西放到指针中时,你必须使用delete来释放这些指针。STL不会为您做到这一点。事实上,STL甚至不知道它们是指针。

另一种选择是根本不使用指针,只使用一组对象,不使用new来创建它们。只需在堆栈上创建它们,并将它们复制到集合中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2394529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档