C++中new和delete导致的内存分配难点_第1页
C++中new和delete导致的内存分配难点_第2页
C++中new和delete导致的内存分配难点_第3页
C++中new和delete导致的内存分配难点_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 中 new 和 delete 导致的内存分配问题详解内容概要 在嵌入式 系统 中使 用 C 的一个常见问题是内存分配 即对 new 和 delete 操作符的失控 具有 讽刺意味的是 问题的根源却是 C 对内存 在嵌入式中应用 C 的一个的日常学识难点是内存分配 即对 new 和 delete 操作符的失控 具有讽刺意味的是 难点的根源却是 C 对内存的管理非比寻常的简易而且安全 具体地说 当一个的对象被消除时 它的析构参数能够安全的释放所分配的内 存 这当然是个好事件 但是这种应用的简单性使得程序员们过度应用 new 和 delete 而不留意在嵌入式 C 环境中的因果联系 并且 在嵌入式系统中 由 于内存的控制 频繁的 Dynamic 分配不定大小的内存会导火索很大的难点以及 堆破碎的风险 作为忠告 保守的应用内存分配是嵌入式环境中的第一原则 但当你必需要应用 new 和 delete 时 你不可不控制 C 中的内存分配 你需求 用一个的全局的 new 和 delete 来代替系统的内存分配符 并且一个的类一个的 类的重载 new 和 delete 一个的防止堆破碎的通用窍门是从不相同固定大小的内存持中分配不相同类别 的对象 对每个类重载 new 和 delete 就帮助了那样的控制 重载全局的 new 和 delete 操作符 没成绩很简易地重载 new 和 delete 操作符 如下所示 void operator new size t size void p malloc size rechanging p void operator delete void p free p 这段源代码没成绩代替默认的操作符来满足内存分配的请求 出于解释 C 的目 的 咱们也没成绩直接调用 malloc 和 free 也没成绩对单个类的 new 和 delete 操作符重载 这是你能灵活的控制对象的 内存分配 class TestClass public void operator new size t size void operator delete void p otIT members ITe void TestClass operator new size t size void p malloc size Resocate the with alternative allocator rechanging p void TestClass operator delete void p free p Resocate the with alternative de allocator 所有 TestClass 对象的内存分配都采用这段源代码 更进一步 任何从 TestClass 继承的类也都采用这一方法 除非它自己也重载了 new 和 delete 操作符 经过重载 new 和 delete 操作符的窍门 你没成绩自由地采用不相同 的分配策略 从不相同的内存池中分配不相同的类对象 为单个的类重载 new 和 delete 必需小心对象数组的分配 你估计期望 调用到被你重载过的 new 和 delete 操作符 但并不如此 内存的请求被定向 到全局的 new 和 delete 操作符 而这一些内存来自于系统堆 C 将对象数组的内存分配作为一个的单独的操作 而不相同于单个对象的内存 分配 为了改变这种方法 你同样需求重载 new 和 delete 操作符 class TestClass public void operator new size t size void operator delete void p otIT members ITe void TestClass operator new size t size void p malloc size rechanging p void TestClass operator delete void p free p int main void TestClass p new TestClass 10 etc delete p 但是留意 对于多数 C 的出现 new 操作符中的个数参数是数组的大小加上 额外的存储对象数目的一些字节 在你的内存分配机制很重要策划的这一点 你应该尽量避免分配对象数组 从而使你的内存分配策略简单 责任编辑 admin 在释放内存中 DemageDemage afterafter normalnormal block 984 block 984 再谈 DAMAGE after Normal block 的解决方法 2008 05 30 21 48 在释放内存时 崩溃了 出现了如下错误 User breakpoint called from code at 0 x7c921230 Debug Assertion Failed Program File dbgheap c Line 1011 Expression CrtIsValidHeapPointer 出现问题的指针 For information on how your program can cause an assertion failure see the Visual C documentation on asserts Press Retry to debug the application 如果点击忽略 则继续弹出对话框 Debug Error Program DAMAGE after Normal block 4826967 at 0 x2000E148 Press Retry to debug the application 正如上次所述 l DAMAGE after Normal block 的解决方法 这次的原因依然是内存申请得太小 具体代码如下 define P2Node LEN 1 1024 10 define P2Node LEN 2 1024 Sct Node 是一个结构体 Sct Node p2Node 定义一个指向 Sct Node 的指针的指针 相当于二维数 组 空间申请 p2Node Sct Node malloc P2Node LEN 1 sizeof Sct Node for int i 0 i p2Node i j sct Node 释放空间 for int i 0 i p2Node i j sct Node 改为 if j P2Node LEN 2 cout Error Out of memory P2No

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论