C++ 在返回的指针为malloc';该函数中的d导致芯片崩溃

C++ 在返回的指针为malloc';该函数中的d导致芯片崩溃,c++,pointers,stm32,C++,Pointers,Stm32,我在主楼里接到这个电话 char* IDQueueString = getIDQueue(); pc.printf("[%9.6f] IDQueue: %s\r\n", t.read(), IDQueueString); free(IDQueueString); 和getIDQueue();是 但是它挂起在0x08009d6e(或者更确切地说是返回到一个WIRQ循环,该循环使用 0x08004ffc: b.n 0x8004ffc 我想知道是什么导致它这样做的? 很明显,free(

我在主楼里接到这个电话

char* IDQueueString = getIDQueue();
pc.printf("[%9.6f] IDQueue: %s\r\n", t.read(), IDQueueString);
free(IDQueueString);
和getIDQueue();是

但是它挂起在
0x08009d6e
(或者更确切地说是返回到一个WIRQ循环,该循环使用

0x08004ffc:   b.n     0x8004ffc
我想知道是什么导致它这样做的? 很明显,
free();
导致了一个问题,但我不知道问题出在哪里。
r1
r2
的值是
0x00000000
r0
0x00000009
r6
0x5DECC885

地址
0x2000001-0x2001FFF(112KB)
是SRAM1的范围,
0x2001C000-0x2001FFF(16KB)
是SRAM2的范围

我不知道该值是关于什么的,但它可能与USB-OCD接口有关


我假设我使用free的方式是不正确的,但是既然我返回了一个指向
malloc();
的指针,为什么我不能以我尝试的方式释放返回的指针呢?

你不能释放不是来自
malloc
的东西-这是“未定义的行为”要做到这一点,取决于运行时的设计,实际发生的是“一切皆有可能”,它可能会挂起、崩溃,通过向普京发送特朗普签署的粗鲁信息来发动核战争,或者“一切都很好”

针对您的特定场景,有两种解决方案:

如果
malloc
失败,则返回
NULL
(如果我们使用的是C++,则最好返回
nullptr
)。如果队列为空,则返回一个
malloc
'd字符串,该字符串包含字符串“empty!”(通过使用
strcpy
或类似值对其进行赋值)

或者,这仅在您知道队列不包含诸如
“Empty!”
“MALLOC!”
之类的词时才有效:在调用
free
之前,请检查它是否不是这些字符串之一(使用
if(strcmp(“Emtpy!”,…)!=0&&strcmp(“MALLOC!”,…)!=0)free(…);


如果将这些字符串放在已知字符串列表中,只需返回该条目,那么就可以使用一个函数通过比较指针值本身来检查“它是已知常量字符串”了。[事实上,当您正在处理的内容中存在相同的内容字符串时,这也会起作用,因为如果内容字符串来自您的代码,它将具有不同的地址]-这也将有助于避免“哦,我更改了返回字符串的值,但不是免费前的检查”的问题,因为这是唯一一个可以更改为bot使用的地方。

每次我看到不可恢复的列表时,我都知道这会很愚蠢。错误的程序逻辑-但编译器必须是错误的:)

在函数调用之前分配内存是一个好方法。所有本地malloc都应该在返回之前释放。这样可以更容易地调试代码(尤其是内存泄漏)

您有无数种与程序的另一部分通信的方法,但您选择的方法是最糟糕的。首先,最好将错误(如失败的mallocs)与应用程序异常(如您的案例中的空名称)分开。我自己会使用此函数返回int(例如,系统错误为负,正常时为零,应用程序异常为正)-使处理它们更容易,指针通过指向指针的指针返回。 但如果您希望在函数中malloc(而不是free)——

if((resultCode = getIDQueue(& IDQueueString) >= 0)
{
   // do something (you can have another switch here to deal with application exceptions like empty name for example)
   free(IDQueueString);
}
else
{
 switch (resultCode) 
 {
   case -1:
     // do something malloc failed
     break:
   case -2:
     //deal with another error 
     break;
  //...... etc etc 
   default:
     // ----
     break;
 }
}

在两种情况下,返回一个不来自<代码> MalOC/的指针。C和C++是不同的语言。除非您特别询问它们之间的区别,否则不要标记两者。@π-OnEnth-To-α-ῥεῖ, 这个问题使用方法,所以这是C++。如果出现错误,你想返回<代码> null <代码>,而不是指针(un<代码>()(代码)!!字符串!文字)。。我建议您使用调试器来查找您的bug。字符串的内容是为了人类可读性,因此它们的内容和匹配的内容不是相关信息。它们来自
uint16\u t
,用
%d
打印。它们的顶部是
{.'、'\0'
{'、''、''>}< /COD> >格式。它也不是真正的C++,我只是在开发中使用<代码> PC.Primtf>代码(虚拟串行),我将删除它。发布时间。我试图给出一个更一般的答案。我不知道你是否计划扩展代码,以便以后使用一些类似的代码来处理一些文本内容。
0x08004ffc:   b.n     0x8004ffc
if((resultCode = getIDQueue(& IDQueueString) >= 0)
{
   // do something (you can have another switch here to deal with application exceptions like empty name for example)
   free(IDQueueString);
}
else
{
 switch (resultCode) 
 {
   case -1:
     // do something malloc failed
     break:
   case -2:
     //deal with another error 
     break;
  //...... etc etc 
   default:
     // ----
     break;
 }
}