我使用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;
}
为什么会这样?我不明白的是什么?
答案 0 :(得分:2)
构造函数中有这一行:
if (queue) { free(queue); } // Free existing data (if any)
其中queue
是数据成员。您正试图释放您从未初始化的垃圾指针值(恰好是非零),从而调用UB。为什么你认为这需要完成?