【发布时间】:2022-01-12 17:13:30
【问题描述】:
我创建了一个数据库类,基本上将 kvp id 的哈希值保存到指针。这是课程:
#ifndef _DATABASE_H_
#define _DATABASE_H_
#include <vector>
#include <list>
#include <map>
using std::vector;
using std::list;
using std::map;
using std::pair;
template <class T>
class Database
{
public:
Database();
virtual ~Database();
virtual T* operator[](int itemID);
virtual int addItem(T* newItem);
virtual int addItem(T* newItem, int itemID);
virtual bool deleteItem(int itemID);
virtual T* removeItem(int itemID); //removes from database but leaves item in memory
virtual T* getItem(int itemID);
virtual const T* getItem(int itemID) const;
virtual void clear();
virtual int numItems() const;
virtual int size() const;
private:
typedef map<int, T*> ContainerType;
ContainerType data;
unsigned int numItems_;
};
template <class T>
Database<T>::Database()
{
}
template <class T>
Database<T>::~Database()
{
this->clear();
}
template <class T>
T* Database<T>::operator [](int itemID)
{
return data[itemID];
}
template <class T>
int Database<T>::addItem(T* newItem)
{
if(newItem == NULL)
return -1;
int id = static_cast<int>(data.size());
pair< ContainerType::iterator, bool> result = data.insert( ContainerType::value_type(id, newItem) );
++numItems_;
return (*(result.first)).first;
}
template <class T>
int Database<T>::addItem(T* newItem, int itemID)
{
if(newItem == NULL)
return -1;
data[itemID] = newItem;
++numItems_;
return itemID;
}
template <class T>
T* Database<T>::getItem(int itemID)
{
if(itemID < 0 || itemID >= size())
return NULL;
return data[itemID];
}
template <class T>
const T* Database<T>::getItem(int itemID) const
{
if(itemID < 0 || itemID >= size())
return NULL;
ContainerType::const_iterator i = data.find(itemID);
if(i == data.end())
return NULL;
return (*i).second;
}
template <class T>
void Database<T>::clear()
{
ContainerType::iterator i;
for(i = data.begin(); i != data.end(); ++i)
{
T* item = (*i).second;
delete item;
item = NULL;
}
numItems_ = 0;
}
template <class T>
bool Database<T>::deleteItem(int itemID)
{
T* item = data[itemID];
if(item)
{
delete item;
data[itemID] = NULL;
data.erase(itemID);
return true;
}
--numItems_;
return false;
}
template <class T>
T* Database<T>::removeItem(int itemID)
{
if(itemID < 0 || itemID > size()-1)
return NULL;
T* item = data[itemID];
data[itemID] = NULL;
data.erase(itemID);
--numItems_;
return item;
}
template <class T>
int Database<T>::numItems() const
{
return numItems_;
}
template <class T>
int Database<T>::size() const
{
return static_cast<int>(data.size());
}
#endif
它大部分都有效,但它似乎正在泄漏内存,我不确定我哪里出错了。有什么建议吗?
【问题讨论】:
-
#define _DATABASE_H_该名称是为语言实现保留的。通过定义它,您的程序的行为将是未定义的。您应该使用另一个标头保护。 -
谁负责免费物品?如果您添加两个具有相同 id 的项目会发生什么?
-
为什么你认为它似乎在泄漏内存?
-
如果不使用
new或malloc系列的成员之一来分配动态内存,程序很难出现泄漏。您更有可能遇到问题,因为程序没有为map<int, T*> ContainerType的实例分配任何动态内存来指向。 -
我的建议是将 T* 替换为 std::shared_ptr
以便自动删除不再引用的 T 对象。