控制C++的内存分配

2016-02-19 12:35 1 1 收藏

图老师小编精心整理的控制C++的内存分配希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】


  在嵌入式系统中使用C++的一个常见问题是内存分配,即对new 和 delete 操作符的失控。   具有讽刺意味的是,问题的根源却是C++对内存的治理非常的轻易而且安全。具体地说,当一个对象被消除时,它的析构函数能够安全的释放所分配的内存。   这当然是个好事情,但是这种使用的简单性使得程序员们过度使用new 和 delete,而不注重在嵌入式C++环境中的因果关系。并且,在嵌入式系统中,由于内存的限制,频繁的动态分配不定大小的内存会引起很大的问题以及堆破碎的风险。  作为忠告,保守的使用内存分配是嵌入式环境中的第一原则。  但当你必须要使用new 和delete时,你不得不控制C++中的内存分配。你需要用一个全局的new 和delete来代替系统的内存分配符,并且一个类一个类的重载new 和delete。  一个防止堆破碎的通用方法是从不同固定大小的内存持中分配不同类型的对象。对每个类重载new 和delete就提供了这样的控制。  重载全局的new 和delete 操作符
  
  可以很轻易地重载new 和 delete 操作符,如下所示:void * operator new(size_t size)
  {
  void *p = malloc(size);
  return (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);
  // .. other members here ...
  };void *TestClass::operator new(size_t size)
  {
  void *p = malloc(size); // Replace this with alternative allocator
  return (p);
  }
  void TestClass::operator delete(void *p)
  {
  free(p); // Replace this 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);
  // .. other members here ..
  };
  void *TestClass::operator new[ ](size_t size)
  {
  void *p = malloc(size);
  return (p);
  }
  void TestClass::operator delete[ ](void *p)
  {
  free(p);
  }
  int main(void)
  {
  TestClass *p = new TestClass[10];
  
  // ... etc ...
  
  delete[ ] p;
  }   但是注重:对于多数C++的实现,new[]操作符中的个数参数是数组的大小加上额外的存储对象数目的一些字节。在你的内存分配机制重要考虑的这一点。你应该尽量避免分配对象数组,从而使你的内存分配策略简单。

来源:http://www.tulaoshi.com/n/20160219/1601244.html

延伸阅读
一、为什么用动态内存分配 但我们未学习链表的时候,假如要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组: float score[30]; !-- frame contents -- !-- /frame contents -- 但是,在使用数组的时候,总有一...
在进行memcpy操作时,虽然是内存操作,但是仍然是耗一点点CPU的,今天测试了一下单线程中执行memcpy的效率,这个结果对于配置TCP epoll中的work thread 数量有指导意义。如下基于8K的内存快执行memcpy, 1个线程大约1S能够拷贝500M,如果服务器带宽或网卡到上限是1G,那么网络io的work thread 开2个即可,考虑到消息的解析损耗,3个线程足以抗...
在前面的练习中我们一直在使用public的继续方式,即共有继续方式,对于protected和private继续方式,即保护继续与私有继续方式我们并没有讨论。 !-- frame contents -- !-- /frame contents -- 对于单个类来说,讨论保护继续与私有继续的区别意义是不大的,他们的区别只在多级继续的情况中体现。 在这里我声明一下,...
C++
/*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout /*p129*/#include class CComplex{public: CCpomplex(double r=0,double i=0) { realPart=r; imagePart=i; } void print() { cout
如果要给二维数组(m*n)分配空间,代码可以写成下面: 代码如下: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n个字符单元, // 上面的m个指针单元指向这n个字符单元首地址 for(i = 0; i m; i++) a[i] = (char * )malloc(n * siz...

经验教程

480

收藏

88
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部