无法使数组的大小加倍

时间:2014-10-12 16:45:01

标签: c++ arrays resize

我希望在调用rehash函数时调整数组大小,方法是将初始字典的值复制到其中,然后最后将newdictionary重新定义为字典

  void rehash ()
    {
        int newsize=2*Size;
        node **newdictionary;
        newdictionary= new node*[newsize];

        //Initialising the dictionary

        for (int i = 0;i < newsize;i++)
        {
            newdictionary[i]->name = "";
            newdictionary[i]->value = -1;
        }

        node **temp=dictionary;
        delete [] dictionary;
        dictionary=newdictionary;
        SIZE=newsize;
        for(int i=0;i<SIZE;i++)
        {
            if(temp[i]->value!= -1)
                    insertvalue(temp[i]->name,temp[i]->value);
        }
        delete [] temp;
    };

之前我已将insertvalue定义为:

      void insertvalue (string filedata, int code)
        {
            // tableindex is the position where I want to insert the value
            dictionary[tableindex]->name= filedata;
            dictionary[tableindex]->value=code;
        };

1 个答案:

答案 0 :(得分:0)

您实际上没有解释您遇到的问题,但您的代码有几个问题:

void rehash ()
{
    int newsize=2*Size;
    node **newdictionary;
    newdictionary= new node*[newsize];

此时,newdictionary只是一个未初始化的指针数组。

    //Initialising the dictionary

    for (int i = 0;i < newsize;i++)
    {
        newdictionary[i]->name = "";
        newdictionary[i]->value = -1;
    }

所以上面的循环试图访问那些尚不存在的node个对象的成员。

    node **temp=dictionary;
    delete [] dictionary;

这两条线路没有意义。 dictionarytemp指向相同的记忆。因此,当您删除dictinoary时,您已删除temp指向的内存。

    dictionary=newdictionary;
    SIZE=newsize;
    for(int i=0;i<SIZE;i++)
    {
        if(temp[i]->value!= -1)
                insertvalue(temp[i]->name,temp[i]->value);
    }

即使您还没有从temp下删除内存,您现在正试图从0访问temp到新尺寸,而不是旧尺寸。换句话说,这将超出其范围访问temp

到目前为止,这些是我在代码中注意到的主要问题。在此之前,您至少需要纠正所有这些问题。你可能需要花一些时间来真正地逐步完成你的逻辑,以确保它最终有意义。