现在的位置: 首页 > 综合 > 正文

规范化的C++编程方法备忘录 内存管理

2013年04月02日 ⁄ 综合 ⁄ 共 1168字 ⁄ 字号 评论关闭

    如果用的C++,就应该知道各种经典的对象管理技术,以及用模板包装常规对象如句柄的方法(例如C++ for COM中的ATL),还可以用类似垃圾收集器的原理管理对象...。
    这里主要说明的是对Win32编程有直接关系的内容,这些内容有部分都可以在不同的资料上被找到,只是比较零散而已。
    不知道妥不妥,我把栈内存管理也放在这里?

 - 不论用C还是C++,对象都会被自动从内存清除,而C++还要在清除前调用析构函数。现在的Windows应用程序占内存都比较大,除了考虑代码量、堆消耗、静态数据段外,减少栈消耗也很重要。但发现大量的程序根本不考虑这一点。
比如下面的代码:

引用:

...
CEgg o1;

o1.ShowDesc();
o1.Draw();

CBird o2;

o2.Jump();
o2.Fly();
...

就可以改成:

引用:

...
{
    CEgg o1;

    o1.ShowDesc();
    o1.Draw();
}
{
    CBird o2;

    o2.Jump();
    o2.Fly();
}
...

因为在本例中o1和o2没有被同时使用的问题,用不着同时占着内存,然后一起释放。
 - 编写Windows程序可能会遇到不要用std库的问题(微软建议过),如果你非要在Win32代码中调用new而不能确定std库是否能用,建议一例(当然,如果能更结构化一些,最好不要搞成这样):
  如果你想这样干:
int * ptr;

ptr = newint  [n];
// uses ptr:
...
  你可将代码写成:

引用:

int * ptr;

try
{
    ptr = new int [n]; // The std::bad_alloc may be thrown from the line.
    if(ptr == NULL)
        throw(ptr);
}
catch(...)
{
  // Recovers from error status.
}
// uses ptr:
...

 - 有关堆内存管理API的补充:
  1.不要以为当系统空闲内存很多时,分配内存就一定成功。要知道你的虚拟内存对整个进程是固定的,当内存碎片化时,可能就没有“空档”能放进你所申请的那块内存。而对于不同的进程,内存视图完全不同,空闲内存会被合并。
  2.当申请了一块可移动块,不要以为对它的锁定操作就一定成功。系统的设计者可以决定分配操作不考虑锁定后的状态而仅考虑有足够数量的空闲内存即可,剩下的道理和1类似。而且,并不保证所有的Windows都是这样设计或者都不是这样设计。研究过内核代码的可能同意或不同意2的观点。问题是如果你是Windows的设计人,你能保证下一个、下一个、...Windows版本也都沿用一样的策略来管理可移动块吗?

抱歉!评论已关闭.