代码之家  ›  专栏  ›  技术社区  ›  Lior Kogan

在任务关键型/生命关键型软件中使用动态分配[已关闭]

c++
  •  6
  • Lior Kogan  · 技术社区  · 15 年前

    在任务关键型/生命关键型系统中使用动态分配安全吗,还是应该避免?

    11 回复  |  直到 15 年前
        1
  •  7
  •   MandoMando    15 年前

    对于关键软件,您希望您的系统具有尽可能确定的行为。

    动态内存、内存碎片、可能的泄漏,以及在某些情况下(不太罕见)malloc的错误行为,将使获得100%确定性变得更加困难。

    证明 您的内存分配和取消分配(空闲)将是确定性的(请参阅RickNZ的宝贵说明),那么您就更接近于拥有确定性系统。

        2
  •  8
  •   James    15 年前

    如果你正在编写这种软件,你应该有一本关于你所遵守的规范的大书(FAA、NATO、FDA等等),说明你能做什么和不能做什么,它会告诉你的。

    如果出现错误情况,负责重新启动软件(即,看门狗定时器,软件必须每100ms重置一次,以防止硬件重置)

        3
  •  4
  •   RickNZ    15 年前

    在“不能失败”类型的应用程序中,当我无法完全避免动态分配时,我使用的一种方法是,在应用程序首次启动时,只分配一次所需的缓冲区和其他数据结构,因此它们永远不需要被释放。循环和释放/删除与新闻/分配不一致,这往往会导致问题。。。

    当这还不够的时候,我使用的另一个技巧是使用我自己的自定义版本malloc和free运行,代码会特别注意检查常见的错误情况,比如释放已经释放的内容,定期验证freelist指针的完整性,查看总内存使用是否随着时间的推移而增加,等等。

        4
  •  3
  •   anon anon    15 年前

    我所研究过的所有交易系统和其他银行软件都大量使用动态分配,它们对于使用它们的IBs来说是至关重要的。我更喜欢避免在对生命至关重要的系统上工作,所以不能为它们说话。

        5
  •  0
  •   rahmivolkan    15 年前

    我是C++新手; 但既然一切都在记忆中;你会用它的。 所以程序员为什么要避免它?

        6
  •  0
  •   Phong    15 年前

    最好避免。随着时间的推移,系统中最小的内存泄漏将导致系统崩溃。例如,像汽车和飞机这样的生命关键系统不使用动态分配。

        7
  •  0
  •   Abhijit K Rao    15 年前

    我觉得你完全可以在任务关键型应用程序、MC应用程序中使用动态内存分配,它们不一定是RT应用程序,它们只是意味着它们对业务运作至关重要。当使用动态内存分配结构时,总是必须进行大型压力测试,这可能会显示内存泄漏,当模拟真实的客户环境时,这样您才能理解动态内存分配的影响,因为它有一个。

        8
  •  0
  •   Thomas Matthews    15 年前

    从传感器读取数据和从其他来源获取实时数据时,不使用动态存储器。许多应用程序使用队列并仅保留当前数据。

        9
  •  0
  •   Loki Astari    15 年前

    我认为,如果没有动态内存分配,编写任何合理的大型系统都是非常困难的。

    但是默认的内存管理是一个通用内存管理器,只有非常有限的保证。

        10
  •  0
  •   MSalters    15 年前

    当然,这没有问题。但是:分配失败不应导致程序失败。

    这一原则扩展到实时程序。实时 malloc 应该有一个上限;在某些情况下,内存可能无法及时使用,并且必须返回NULL。

        11
  •  -4
  •   Charles Eli Cheese    15 年前

    嗯,你不能避免动态分配。不知何故,在某个地方,您的堆栈至少必须得到分配。通常,当人们开始过分担心某样东西是在堆栈上还是堆上时,这表明他们变得有点滑稽。与堆相关的错误一样,可以有多个或多个与堆栈相关的错误,但在测试中,只要避免使用自己内存管理的lib,就可以很容易地捕获与堆相关的错误。但是,C++最初并不是这种应用程序的最佳语言。