为LinkedList调用delete时,变量被分配了不同的内存



我使用链表来存储二进制位的信息。度数告诉将整数2提升到.的幂

问题出现在我的set_bit方法中。它应该在找到"target"节点指针后删除节点指针"currentSet"。然而,currentSet并没有设置为null/释放内存,而是被赋予了一个不同的、更低的内存地址。为什么会这样?我做错了什么?当我明确地将currentSet出售给nullptr,但不应该删除currentSet时,程序就可以工作了?

以下是头的实现

//file is "binary.cpp"
#include <iostream>
#include "binary.h"
//using std::cout;
Binary::Binary(int x) {
    firstTerm = nullptr;
    while (x > 0) {
        unsigned int degree = (unsigned int) (log(float(x)) / log(float(2)));
        set_bit(1, degree);
        x -= (int) pow(float(2), float(degree));
    }
}
Binary::~Binary() {
    BinaryNode *temp;
    while (firstTerm != nullptr) {
        temp = firstTerm->next;
        delete firstTerm;
        firstTerm = temp;
    }
}
void Binary::set_bit(int bit, int degree) {
    BinaryNode *currentSet = firstTerm;
    BinaryNode *target;
    std::cout << "get_bit returns " << get_bit(degree) << std::endl;
    if (bit == 0 && get_bit(degree)) {
        std::cout << "bit = 0 " << std::endl;
        std::cout << "currentSet->degree " << currentSet->degree << std::endl;
        if (currentSet->degree == degree) {
            std::cout << "in if" << std::endl;
            firstTerm = currentSet->next;
            delete currentSet;
            std::cout << "end if" << std::endl;
        }
        else {
            target = currentSet;
            std::cout << "in else" << std::endl;
            while (currentSet != nullptr) {
                if (currentSet->degree == degree) {
                    std::cout << "in nested if" << std::endl;
                    //std::cout << "currentSet->degree = " << currentSet->degree << std::endl;
                    target->next = currentSet->next;
                    std::cout << "currentSet before delete " << currentSet << std::endl;
                    delete currentSet;
                    std::cout << "currentSet " << currentSet << "nend nested if" << std::endl;
                }
                else {
                    std::cout << "in nested else" << std::endl;
                    std::cout << "firstTerm->next = " << firstTerm->next << std::endl;
                    std::cout << "currentSet->next = " << currentSet->next << std::endl;
                    target = currentSet;
                    currentSet = currentSet->next;
                    std::cout << "currentSet->next = " << currentSet->next << std::endl;
                    std::cout << "end nested elsen";
                }
            }
        }
    }
    else if (bit == 1 && get_bit(degree) == 0) {
        std::cout << "bit = 1" << std::endl;
        firstTerm = new BinaryNode(degree, firstTerm);
        /*if (firstTerm->next  nullptr) {
            currentSet = firstTerm;
        }*/
        std::cout << "firstTerm = " << firstTerm << std::endl;
        std::cout << "firstTerm->degree = " << firstTerm->degree << std::endl;
        std::cout << "firstTerm->next = " << firstTerm->next << std::endl;
    }
}
int Binary::get_bit(int degree) const {
    BinaryNode *currentGet = firstTerm;
    while (currentGet != nullptr) {
        //std::cout << "currentGet != nullptr";
        if (currentGet->degree == degree) {
            return 1;
        }
        currentGet = currentGet->next;
    }
    return 0;
}

这是标题

//file is "binary.h"
#ifndef _BINARY_H_
#define _BINARY_H_
#include <iostream>
class Binary {
private:
    struct BinaryNode {
        int degree;
        BinaryNode* next;
        BinaryNode(int d, BinaryNode* n): degree(d),next(n) {}
    };
    BinaryNode *firstTerm;
public:
    // default constructor
    Binary() {
       firstTerm = nullptr;
    }
void set_bit(int b, int d);
int get_bit(int d) const;
#endif

这是测试文件

//file is "binary_main.cpp
#include <iostream>
#include "binary.h"
using namespace std;
int main (void)
{
    cout << "nTESTING GET AND SET METHODS" << endl;
    b1.set_bit(1, 2);
    b1.set_bit(1, 5);
    b1.set_bit(1, 0);
    b1.set_bit(0, 2);
}

已编辑

显式设置currentSet为nullptr,答案是使用n.m.的信息找到的。

相关内容

  • 没有找到相关文章

最新更新