为什么新操作员挂起我的程序?

时间:2017-07-09 12:47:00

标签: c++ arduino

我使用Arduino但我认为这不是Arduino相关问题,但我不明白。 当我使用以下代码时,一切都很完美:

#include <Queue.h>

typedef struct strRec {
    int entry1;
    int entry2;
} Rec;

Rec tab[3] = {
    { 700, 7000 },
    { 300, 3000 },
    { 1000, 1000 },

};

Queue q(sizeof(Rec), 2, FIFO);  // Instantiate queue

void setup() {
    Serial.begin(19200);

    unsigned int i;

    for (i = 0 ; i < 3 ; i++)
    {
        Rec rec = tab[i];
        q.push(&rec);
    }

    for (i = 0 ; i < 5 ; i++)
    {
        Rec rec;
        if(q.pop(&rec)) {
        Serial.print(rec.entry1);
        Serial.print(" ");
        Serial.println(rec.entry2);
        }
        else {
            Serial.println("No records");
        }
    }

}

但是当我使用 new 创建一个实例时,程序会在操作符之后挂起:之后没有执行任何操作。

#include <Queue.h>

typedef struct strRec {
    int entry1;
    int entry2;
} Rec;

Rec tab[3] = {
    { 700, 7000 },
    { 300, 3000 },
    { 1000, 1000 },

};

Queue* q;   

void setup() {
    Serial.begin(19200);

    q = new Queue(sizeof(Rec), 2, FIFO);

    unsigned int i;

    for (i = 0 ; i < 3 ; i++)
    {
        Rec rec = tab[i];
        q->push(&rec);
    }

    for (i = 0 ; i < 5 ; i++)
    {
        Rec rec;
        if(q->pop(&rec)) {
        Serial.print(rec.entry1);
        Serial.print(" ");
        Serial.println(rec.entry2);
        }
        else {
            Serial.println("No records");
        }
    }

}

但是如果我不调用Queue类的任何方法但只创建它,则可以执行下面的代码

Serial.println("some text before"); //this text can be printed
q = new Queue(sizeof(Rec), 2, FIFO);
Serial.println("some text after"); //this text can be printed too

如果我在这里有方法调用,则调用会在 new 之后立即挂起程序,但在方法调用之后不会挂起

Serial.println("some text before"); //this text can be printed
q = new Queue(sizeof(Rec), 2, FIFO);
Serial.println("some text after"); //this text can not be printed and the program hangs here
Rec rec = tab[1];
q->push(&rec);

我甚至尝试更改 push 方法,除了代码挂起之外什么都不做。 如果我用免费注释字符串我的代码正常工作,所以问题在这里,但我没有理解为什么

Queue::Queue(uint16_t size_rec, uint16_t nb_recs, QueueType type, bool overwrite)
{

    rec_nb = nb_recs;
    rec_sz = size_rec;
    impl = type;
    ovw = overwrite;

    if (queue)  { free(queue); }    // If I comment this string it works as I need
    queue = (uint8_t *) malloc(nb_recs * size_rec);

    clean();
}

Queue::~Queue()
{
  free(queue);
}


void Queue::clean(void)
{
    in = 0;
    out = 0;
    cnt = 0;
}

为什么会这样?我不明白的是什么?

Here is the Queue class

1 个答案:

答案 0 :(得分:2)

构造函数中有这一行:

if (queue) { free(queue); } // Free existing data (if any)

其中queue是数据成员。您正试图释放您从未初始化的垃圾指针值(恰好是非零),从而调用UB。为什么你认为这需要完成?