内存分配访问无效:delete导致的内存分配问题



 作为忠告保守使用内存分配是嵌入式环境中原则

  但当你必须要使用 和delete时你不得不控制C内存分配你需要用个全局 和delete来代替系统内存分配符并且个类个类重载 和delete

  个防止堆破碎通用思路方法是从区别固定大小内存持中分配区别类型对象对每个类重载 和delete就提供了这样控制

  重载全局 和delete 操作符

  可以很容易地重载 和 delete 操作符如下所示:

void * operator (size_t size)
{
 void *p = malloc(size);
  (p);
}
void operator delete(void *p);
{
 free(p);
}


  这段代码可以代替默认操作符来满足内存分配请求出于解释C我们也可以直接malloc 和free

  也可以对单个类 和 delete 操作符重载这是你能灵活控制对象内存分配

TestClass {
 public:
  void * operator (size_t size);
  void operator delete(void *p);
  // .. other members here ...
};

void *TestClass::operator (size_t size)
{
 void *p = malloc(size); // Replace this with alternative allocator
  (p);
}
void TestClass::operator delete(void *p)
{
 free(p); // Replace this with alternative de-allocator
}


  所有TestClass 对象内存分配都采用这段代码更进任何从TestClass 继承类也都采用这方式除非它自己也重载了 和 delete 操作符通过重载 和 delete 操作符思路方法你可以自由地采用区别分配策略从区别内存池中分配区别类对象

  为单个类重载 [ ] 和 delete[ ] 必须小心对象分配你可能希望到被你重载过 和 delete 操作符但并不如此内存请求被定向到全局[ ]和delete[ ] 操作符而这些内存来自于系统堆

  C将对象内存分配作为个单独操作而区别于单个对象内存分配为了改变这种方式你同样需要重载[ ] 和 delete[ ]操作符

TestClass {
 public:
  void * operator [ ](size_t size);
  void operator delete[ ](void *p);
  // .. other members here ..
};
void *TestClass::operator [ ](size_t size)
{
 void *p = malloc(size);
  (p);
}
void TestClass::operator delete[ ](void *p)
{
 free(p);
}
(void)
{
 TestClass *p = TestClass[10];

 // ... etc ...

 delete[ ] p;
}


  但是注意:对于多数C实现操作符中个数参数是大小加上额外存储对象数目些字节在你内存分配机制重要考虑你应该尽量避免分配对象从而使你内存分配策略简单
Tags:  内存分配失败 虚拟内存分配 内存分配 内存分配访问无效

延伸阅读

最新评论

发表评论