缺少未声明的数组元素的nullptr

时间:2015-03-01 17:28:54

标签: c++ hashmap nullptr

我正在尝试制作一个基本的HashMap。在插入元素之前,我正在检查元素是否存在于索引中。当我插入我的第一个元素时,它表示该元素已存在于该位置。我已经完成了调试器,除了map[hash]之外,我的所有值都是预期的。我期待一个nullptr,但它不会来。 map[hash]具有以下值:

-       map[hash]   0xcdcdcdcd {key=??? value={...} next_element=??? }  HashElement *

有人可以向我解释我在这里的误解吗?意外的结果是line 21 HashMap.cpp。以下是相关代码:

HashMap.h

#pragma once
#include <string>

#include "HashElement.h"

class HashMap
{
private:
    HashElement **map;
    int size;
public:
    HashMap(int);
    ~HashMap();
    int GetHash(int);
    void Put(int, std::string);
};

HashMap.cpp

#include "HashMap.h"

#include <string>

HashMap::HashMap(int _size)
{
    size = _size;
    map = new HashElement*[size];
}

HashMap::~HashMap()
{
}

int HashMap::GetHash(int _key){
    return _key % size;
}

void HashMap::Put(int _key, std::string _value){
    int hash = GetHash(_key);
    if (!map[hash]){  //Anticipated to be nullptr on first Put, but it skips to else
        map[hash] = new HashElement(_key, _value);
    }
    else{
        HashElement *lastElement = map[hash];
        while (lastElement->next_element){
            lastElement = lastElement->next_element;
        }
        lastElement->next_element = new HashElement(_key, _value);
    }
}

HashElement.h

#pragma once

#include <string>

class HashElement
{
private:
    int key;
    std::string value;
public:
    HashElement(int, std::string);
    ~HashElement();
    HashElement *next_element;
    int get_key();
    std::string get_value();
};

HashElement.cpp

#include "HashElement.h"

HashElement::HashElement(int _key, std::string _value)
{
    key = _key;
    value = _value;
}

HashElement::~HashElement()
{
}

int HashElement::get_key(){
    return key;
}

std::string HashElement::get_value(){
    return value;
}

2 个答案:

答案 0 :(得分:1)

map[hash]不是nullptr,因为您尚未对其进行初始化。

map = new HashElement*[size];

map数组中的每个元素在该行之后都有一个随机值。

要解决此问题并将所有元素初始化为nullptr

map = new HashElement*[size]();
                            ^^

答案 1 :(得分:1)

map = new HashElement*[size];

在这里,您将在堆上实例化一个size指针数组。正如我理解你的问题,你假设这个new数组中的所有实例化指针都是nullptr

事实并非如此。对于“普通旧数据”或POD,默认情况下不会初始化其内容。你必须明确地初始化它们:

for (size_t i=0; i<size; ++i)
    map[i]=0;

...在构造函数中