为什么我不能打印薪水?

时间:2013-04-16 18:52:24

标签: c++

我正在编写一个准数据库。

我有一个班对:

class Pair{
    MyString m_key;
    Data* m_data;
}

然后方法AddItem组合该对并将其添加到数据库中。

Data Ivanov(1, 10, "Manager", 100000);
Data Petrov(2, 20, "Manager", 200000);
MyString* employee0 = new MyString("Ivanov");
MyString* employee1 = new MyString("Petrov");
bd.AddItem(employee0, &Ivanov);
bd.AddItem(employee1, &Petrov);

数据库本身监视元素的数量和容量。     Bd级{         私人的:             int m_size;             int m_capacity;             配对**;             ...     }

如果我们添加一个项目,则数据库会在容量溢出时延伸。 如果我们删除一个项目,则会出现一个可能在将来使用的空单元格。 这样做是为了不使堆太多碎片。

void Bd:: AddItem(MyString* key, Data* data){
    if (m_size < m_capacity){
        *ar[m_size+1] = Pair(key, data);
    }
    else{ 
        if (m_size == 0){
            ar = new Pair*[++m_size];
            m_capacity++;           
            ar[0] = new Pair(key, data);
            stop
        }
        else{
            Pair** tmp = new Pair*[++m_size];  
            m_capacity++;
            memcpy(tmp, ar, m_size * sizeof(Pair*));
            delete[] ar;
            ar = tmp;
            ar[m_size-1] = new Pair(key, data);
            stop
        }
    }
}


void Bd::RemoveItem(const char* a_key){
    Pair** tmp_ar = this->get_ar();
    for (int i = 0; i < m_size; i++){       
        Pair* tmp_key = tmp_ar[i];
        MyString* tmp_my_string= (*tmp_key).get_m_key();
        const char* tmp_str = (*tmp_my_string).GetString();
        if ( strcmp(tmp_str, a_key) == 0){
            delete ar[i];           
            for (int j = i; j < m_size-1; j++){
                *ar[j] = *ar[j+1];
            }
            delete ar[m_size-1];
            m_size--;
            break;
        }
        stop
        if (i == (m_size-1)){
            cout << "No such person." <<endl;           
        }
    }   
    stop
}

好吧,现在我想使用bd。

cout << bd;
bd.Print("Ivanov");
bd.Print("Petrov");

完美无缺。它还打印整个数据库或任何元素。

然后我删除伊凡诺夫先生。 bd.RemoveItem( “诺夫”);

现在我遇到了以下任何一个问题:

bd.Print("Petrov");
cout << bd;

我在类Data中有一个打印方法。

void Data:: print_info(){   
    cout << "Sex: " << this->getSex() << ", age: " << age <<", position: " << position <<", salary: ";
    cout << salary << endl; 
}

我特意做了第二次cout,因为这是我遇到麻烦的地方。 虽然薪水在范围内清晰可见,但却导致整个问题。 请看一下这张照片:

enter image description here

如果再多做一步,我会收到有关堆损坏的错误。 输出窗口显示:HEAP:Free Heap block 296b30在被释放后在296b58处修改

你能帮我理解为什么我不能打印这份工资吗?

1 个答案:

答案 0 :(得分:0)

我在AddItem()中看到了以下问题:

void Bd:: AddItem(MyString* key, Data* data){
    if (m_size < m_capacity){
        *ar[m_size+1] = Pair(key, data);
    }

如果m_size小于m_capacity,则添加新项但不增加m_size

    else{ 
        if (m_size == 0){
            ar = new Pair*[++m_size];
            m_capacity++;           
            ar[0] = new Pair(key, data);
            stop
        }

我认为您打算检查m_capacity是否为0。

        else{
            Pair** tmp = new Pair*[++m_size];  
            m_capacity++;
            memcpy(tmp, ar, m_size * sizeof(Pair*));
            delete[] ar;
            ar = tmp;
            ar[m_size-1] = new Pair(key, data);
            stop
        }

memcpy正在复制ar,其大小为m_size,然后才会增加m_size,但现在大小为m_size-1,所以你复制了数组的末尾。

RemoveItem()中的以下问题:

if ( strcmp(tmp_str, a_key) == 0){
    delete ar[i];           
    for (int j = i; j < m_size-1; j++){
        *ar[j] = *ar[j+1];
    }
    delete ar[m_size-1];
    m_size--;
    break;
}

您的delete ar[m_size-1]正在删除您刚搬到ar[m_size-2]的商品。你不想删除它。

我认为此删除可能是您问题的一部分。具体来说,我认为以下2个更改将有所帮助:

  1. 如评论中所述,将*ar[j] = *ar[j+1]行更改为ar[j] = ar[j+1]
  2. 摆脱delete ar[m_size-1];行。与ar行更改一样,您绝对不希望这样。
  3. 这不会解决所有问题,但会确保您在尝试调用Petrov方法之前未删除print_info()