C++ 为Mbed BufferedSerial对象分配的动态内存大小错误
我试图在nrf52840上的堆中分配mbed::BufferedSerial对象的两个实例。第一次分配成功,串口的第一个实例工作正常,但创建第二个串口对象实例后,第一个实例停止工作。调试显示,第二个对象覆盖内存中第一个对象的最后16个字节。原因是,虽然sizeof(BufferedSerial对象)是856字节,但新操作符只分配840字节,因此,在下一次堆分配时,最后16个字节将被覆盖 传递的count参数是840B:operator new(std::size\u t count) 创建后对象的大小为856B:sizeof(*g_串行_端口[0]) 有人知道为什么会发生这种情况以及如何解决吗?执行分配的代码如下(使用GNU工具Arm Embedded 9 2019-q4-major编译): 串行api.cppC++ 为Mbed BufferedSerial对象分配的动态内存大小错误,c++,arm,heap,new-operator,mbed,C++,Arm,Heap,New Operator,Mbed,我试图在nrf52840上的堆中分配mbed::BufferedSerial对象的两个实例。第一次分配成功,串口的第一个实例工作正常,但创建第二个串口对象实例后,第一个实例停止工作。调试显示,第二个对象覆盖内存中第一个对象的最后16个字节。原因是,虽然sizeof(BufferedSerial对象)是856字节,但新操作符只分配840字节,因此,在下一次堆分配时,最后16个字节将被覆盖 传递的count参数是840B:operator new(std::size\u t count) 创建后对象
static mbed::BufferedSerial *g_serial_port[2] =
{ NULL };
extern “C” void create(id, tx , rx)
{
g_serial_port[id] = new mbed::BufferedSerial(tx, rx);
}
main.c
int main()
{
create(0, P1_14, P1_15); //the heap allocated is 16 bytes smaller than the object
create(1, P1_12, P1_13); // this object's allocation overwrites the last 16 bytes of the previous one.
…
}
David Schwartz的评论为我提供了寻找不匹配的预处理器宏定义的线索。
问题在于设备\u串行\u FC预处理器宏。当mbed构建为库时,宏已启用。但是,在项目中使用库及其头文件时,它被禁用。这个不匹配导致了问题。我打赌编译器选项或头文件包含的某些更改会导致
sizeof(mbed::BufferedSerial)
在两个不同的位置不同。一个ifdef
或包含两个不同的头文件,这些头文件提供相同类型名称的不同定义。编译器选项同上,这些选项更改标准类型(如int
或double
的大小)。在main
中记录或输出该值,我敢打赌您会得到一个较小的值。