读书人

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

发布时间: 2013-03-14 10:33:15 作者: rapoo

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

欢迎各位纠错

读书人网 >C++

热点推荐