Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为Mbed BufferedSerial对象分配的动态内存大小错误_C++_Arm_Heap_New Operator_Mbed - Fatal编程技术网

C++ 为Mbed BufferedSerial对象分配的动态内存大小错误

C++ 为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) 创建后对象

我试图在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.cpp

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
中记录或输出该值,我敢打赌您会得到一个较小的值。