C++ 中基于堆(Heap-based or static global scope)的范围管理与基于堆栈(Stack-based scope)的范围管理有哪些细微差异和潜在风险?

3回答

C++ 中基于堆(Heap-based or static global scope)的范围管理与基于堆栈(Stack-based scope)的范围管理有哪些细微差异和潜在风险?

提问者 程序媛Adele 2015-04-30 349浏览

快来消灭0回答吧

{{ dataList.answer_count | view-format }}回答
  • 何小成 2015-08-29 23:18
    “架构如老婆,合适就是最好的。”。。。。这句话在理。。。文章分析挺好,不同游戏,不同的架构设计
    0评论
  • 程序媛Adele 2015-05-04 11:20
    主要区别是在heap上分配的内存和对象,需要上层调用者自己释放。而stack上分配的对象,在渡过了对象生命周期后会被自动释放。stack的内存是有上限的,一般是10MB,而heap可分配内存非常大。
    0评论
  • 程序媛Adele 2015-05-04 11:20
    重点关注栈使用的大小,避免越界可能出现的不确定性问题,栈属于线程,虽然可以修改大小,但通常不会去改它。
    0评论
  • 程序媛Adele 2015-05-04 11:21
     对于不具备析构语义的语言,例如C语言,它的资源管理通常是手工处理的,例如分配在堆上的内存,通常需要手工释放,这里存在一些风险,例如人为忘记释放,或者结构化异常导致释放代码无法被触达等。这通常需要很小心地去处理以避免泄漏的产生。

    对于具有析构语义的语言,例如C++,由于栈对象具有析构被自动调用的特性,我们可以利用其进行自动的生存期管理,这就是我们常说的RAII技术,即所谓“资源申请即初始化”,该技术通过栈对象的生存期来间接管理资源的生存期,由于析构的调用通常是编译器保证的(类似c++的placement new之类的场景除外),因此即使是异常场景,编译器仍然保证生成的析构代码能够被安全调用,这就使得在析构函数中回收资源的代码能够被确定性地执行从而避免了资源泄漏。而被管理的资源可以是任何类型的,例如堆内存,网络连接,文件句柄,数据库连接等各种资源。

    栈对象这样的定义可能有些狭义,实际上更广义的说法是生存期明确的自动变量。例如对于函数来说,就是定义在函数栈上的局部变量,对于类来说,就是它的非静态成员。这些变量的生存期都是可以预期的,函数的局部变量的析构一定会在函数结束时被调用,类的非静态成员的析构一定在对象销毁前被调用,这样的确定性生存期,给我们的资源管理带来保证。例如在对象构建过程中,如果出现异常,由于对象尚未完整构建,导致其析构不会被调用,但由于其非静态成员的确定性释放,让我们可以通过类似智能指针成员的手段,确保预先分配的资源一定会回收。

    当然,RAII技术偶尔也会导致一些隐蔽的陷阱,例如对于STL的string来说,C++规定其必须具有写复制特性,即通常string之间传递的是引用,只有在被修改的情况下,才产生真正的内存复制,而这些内存都是通过RAII来管理的。这里有一个场景,在windows下,如果两个模块通过/MT选项来编译,则两个模块将分别拥有各自的CRT堆句柄,此时,如果模块A的函数返回一个string,模块B调用这个函数并将返回值保存在自己的变量中,则当模块B的变量RAII生效的时候,释放内存的代码使用的是模块B的CRT堆句柄,从而引发异常情况。这种”自动处理”显然不是我们希望的,需要小心地规避。

    0评论
  • 乡下仔 2015-10-25 12:23

    问下,你同步进程在定时轮询共享内存上是否有数据变更后,如果变更就同步到keyvalue  系统,这里有一个问题,同步的瞬间如果逻辑进程也是在操作这块内存,那么很有可能出现这样的一些情况 比方一个64位整形 逻辑进程只写了前面32位等等这些情况 不知道你们如何去解决的呢?

    0评论
  • rajRKO 2017-06-21 14:40

    Wifi Hacker App: Use of the internet is available in high number, and it is made as a mandatory thing now for each. wifi hacker Hacking apps are available for WiFi Hacker Apk For Android, WiFi Hacker for iOS, WiFi Hacker for Blackberry, WiFi Hacker for Windows Phone, WiFi Hacker for Windows PC, WiFi Hacker for iPad and WiFi Hacker for Mac PC.

    0评论
  • {{ answer.user.NickName }} {{ answer.profession }} {{ answer.created_at | time-format }}
    专家回答
    {{{ answer.answer }}}
    {{ answer.answer_count | view-format }}评论
加载中... 查看更多回答

相关问题

腾讯游戏学院公众号