繁体   English   中英

嵌入式C中的动态内存分配

[英]Dynamic memory allocation in embedded C

我可以在嵌入式C中使用函数malloc和delete吗? 例如,我有一个函数,在其中使用malloc函数在结构上创建了指针。 这个函数在ram中的返回地址,我可以使用this。 从分配了内存的函数退出后,该指针将被删除或为此保留的内存,而函数删除不会终止吗?

Typedef struct {
  Char varA;
  Char varB 
} myStruct ;

Void myfunc ( void) 
{
  myStruct * ptrStruct = ( myStruct *) malloc ( sizeof (myStruct)) ;
  // Code here 
  //........

  return ;    
}

通常,您不应在嵌入式系统中使用malloc ,因为这样做没有任何意义 ,如此处所述 特别是,在裸机系统上使用它毫无意义。

使用动态内存分配唯一有意义的地方是大型托管的多进程系统,其中多个进程共享同一RAM。 如果您将嵌入式系统定义为Android智能手机或便携式PC,那么可以使用malloc。

如果您发现自己在其他任何地方使用它,则几乎可以肯定意味着您的程序设计从根本上来说是有缺陷的,并且您也不知道堆是如何工作的。

另外,几乎每个嵌入式系统编程标准都禁止动态内存分配。

对于阻止使用动态内存的嵌入式系统,没有任何具体规定。

但是,您可能需要以多种方式为其提供支持,例如:

  • 您需要确保链接器为动态堆分配足够的空间。 某些链接描述文件可能已经在堆栈和任何其他保留分配之后自动将所有剩余内存分配给堆。
  • 您可能需要实现低级存根,以允许库访问堆内存-例如,在newlib库中,您需要实现sbrk_r()以便malloc()等正常工作。
  • 在多线程系统中,您可能需要实现互斥体存根以确保安全地分配堆。 如果该库不提供此类存根,则在这种环境中使用malloc() / free()等将不安全,因此您应该编写在外部声明锁的包装函数。

但是,出于多种原因,您为什么可以选择避免在嵌入式系统中使用动态内存(或至少使用标准库实现的动态内存):

  • 标准分配方案具有不确定的时序,不适用于硬实时系统。
  • 您需要为每个分配适当地处理分配失败的可能性。 安全地处理潜在的不确定性运行时错误比使编译器在构建时告诉您内存不足,要复杂得多。
  • 您需要防止内存泄漏; 任何系统都适用,但是没有操作系统来管理内存耗尽并消除泄漏的进程,那么您的系统将如何运行?
  • 没有互斥体存根或包装函数,标准库堆管理可能不是线程安全的。
  • 破坏堆的错误不太可能立即影响执行,通常仅在执行新的堆操作时才引起可观察到的故障,从而在与实际原因无关的时间和位置导致不确定的行为-使其很难诊断。 同样,这对任何系统都是如此,但是交叉托管的嵌入式系统中的调试功能通常不如自托管系统的调试功能复杂。

是的,您可以在嵌入式C中使用malloc。某些嵌入式系统具有其自己的封装内存分配API。 malloc()是C lib API。

内存是从堆分配的,堆是系统设计者定义的专用内存范围。 如果函数退出后您没有释放分配的内存,则分配的内存将被保留,其他进程将无法使用它。 通常,这是内存泄漏。 如果您释放分配的内存,但在此之后仍使用指针,则它是一个野指针,将导致未知的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM