首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++编程思想下的题 求高手

2013-03-14 
C++编程思想上的题 求高手//1-5.cpp//创建一个类,这个类带有自己的new运算符//这个运算符为十个对象分配内

C++编程思想上的题 求高手
//1-5.cpp
//创建一个类,这个类带有自己的new运算符
//这个运算符为十个对象分配内存,并且为第11对象分配内存时抛出"run out of menmory"(内存用完)异常
//并且添加一个静态成员函数用语回收这个内存
//创建main()函数其中包含try块和catch子句,在catch子句中调用回收内存的子例程
//把这些代码放在一个while循环中,用于演示从异常恢复并继续执行的过程 C++ 编程
[解决办法]


struct test
{
std::list< obj *> list;

void Create() 
{
    for (index = 0; index < 10; index++ )  list.push_back( new obj);

    new obj 
[解决办法]
 throw( "run out of menmory" );    
}

static void Release()
{
    for( obj* p : list )
   {
         SAFE_DELETE( p );
    }
}
}


int main()
{
try {
test a;

a.Create();

}
catch ( run out of menmory  ) {
test::release();
}
return 0;
}



伪码,仅供参考
[解决办法]
pseudo codes



#include <iostream>
#include <new>
#include <stdexcept>
#include <vector>

class example
{
  public :
    static void* operator new(size_t)
    {
       if(data_.size() != 10){
         data_.push_back(::new example);

         return data_.back();
       }else{
         throw std::bad_alloc();
       }
    }

    static void operator delete(void*) throw()
    {
       release();
    }

    static void release()
    {
      for(std::vector<example*>::iterator it = data_.begin();
          it != data_.end(); ++it){
        if(*it != 0){
          ::delete *it;
        }
      }
      //if your compiler support c++11, this one is shorter and more effective
      /*for(auto it : data_){
         if(*it != 0){
            ::delete *it;
          }
      }*/
    }

    ~example(){ release(); }


  private :
    static std::vector<example*> data_;
};

std::vector<example*> example::data_;

int main()
{
  try{
    for(size_t i = 0; i != 11; ++i){
        example *object = new example;
    }
  }catch(std::exception const &ex){
      std::cout<<ex.what()<<std::endl;
      example::release();
  }

  example::release();

  return 0;
}



解法很多,我尽我所能的挑了比较简单的

如果要更简单,我们可以把example*改成vector<example>
回传时改成&data_.back(),这一来管理memory的任务就全都
落到vector的身上了,不过这方法可能跟题意不太相符

代码讲解
1 : operator new, operator delete永远为static,请你为他们加上
static以方便你的用户阅读,维护
2 : operator new必得伴随operator delete,反之亦然,
虽然编译器不强迫你那么做
3 : ::new及::delete代表呼叫global的new和delete

欢迎各位纠错

热点排行