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;
}
}