У меня есть вопрос о вставке чего-либо в std::map на C++.
Вот мой код:
stringutils.hh:
...
unsigned long hashSDBM(char *strToHash){
unsigned char* str = new unsigned char[strlen(strToHash) + 1];
strncpy( (char *) str, strToHash, strlen(strToHash) );
unsigned long hash = 0;
int c;
while ((c = *str++)){
hash = c + (hash <<6) + (hash <<16) - hash;
}
return hash;
}
...
hashmap.hh
#include "stringutils.hh"
namespace{
using namespace std;
class MapElement{
private:
char* filename;
char* path;
public:
MapElement(char* f, char* p):filename(f), path(p){}
~MapElement(){
delete [] filename;
delete [] path;
}
char* getFileName(){ return filename; }
char* getPath(){ return path; }
};
class HashMap{
private:
map<long*, MapElement*> *hm;
long hash(char* key);
public:
HashMap(){
hm = new map<long*, MapElement*>();
}
~HashMap(){
delete hm;
}
long put(char* k, MapElement *v);
};
long HashMap::hash(char* key){
return stringutils::hashSDBM(key);
}
long HashMap::put(char* k, MapElement *v){
long *key = new long();
*key = hash(k);
pair<map<long*,MapElement*>::iterator, bool> ret;
ret = hm->insert(std::pair<long*, MapElement*>(key, v));
if(ret.second == false){
cerr<<"Already exists: "<<ret.first->second->getFileName()<<endl;
return *key;
}
cerr<<"INSERTED "<<*key<<endl;
return 0;
}
основной.cc:
HashMap *hm = new HashMap();
int main(void){
MapElement *m1;
char a[] = "hello";
char b[] = "world";
m1 = new MapElement(a,b);
hm->put(a, m1);
char c[] = "thats";
char d[] = "a test";
m1 = new MapElement(c,d);
hm->put(c, m1);
char e[] = "hello";
char f[] = "test";
m1 = new MapElement(e,f);
hm->put(e, m1);
return 0;
}
Он компилируется без каких-либо ошибок или предупреждений, и когда я его запускаю, генерируется следующий вывод:
ВСТАВЛЕННЫЙ 7416051667693574450
ВСТАВЛЕННЫЙ 8269306963433084652
ВСТАВЛЕННЫЙ 7416051667693574450
Почему вторая вставка с клавиши «привет» не имеет никакого эффекта?
hashSDBM
) происходит утечка памяти. Вы должны использоватьstd::string
вместо необработанных строкchar *
. - person paercebal   schedule 01.10.2012HashMap
не освобождает память, выделенную для всех ключей и значений. ДеструкторMapElement
никогда не вызывается, но если бы он это сделал, он бы выдал ошибку сегментации, потому что слепо вызываетdelete[]
для указателей на автоматические переменные, а не на динамически выделяемую память. Ни один из классов правильно не обрабатывает копирование или присваивание. Пожалуйста, прекратите использоватьpointers
иnew
. - person Blastfurnace   schedule 01.10.2012