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

怎么让new失败啊

2012-12-16 
如何让new失败啊?最近看书说,new失败后,会抛出异常,想尝试一下,但是如何让new失败呢?我试过两种方法:1是分

如何让new失败啊?
最近看书说,new失败后,会抛出异常,想尝试一下,但是如何让new失败呢?
我试过两种方法:
1是分配很大的数组,但是VS2010是在太智能了,数组长度太大时直接就在编译时报错:error C2148: 数组的总大小不得超过 0x7fffffff 字节。
2.是通过单例模式。我是现找的:



class CSingleton
{
//其他成员
public:
static CSingleton* GetInstance()
{
if ( m_pInstance == NULL )  //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
void fun()
{
cout<<"fun"<<endl;
}
private:
    CSingleton(){};
    static CSingleton *m_pInstance;
};


CSingleton* CSingleton::m_pInstance = NULL;


class Test2
{
public:
double dval;

};
int main()
{

CSingleton* p1 = CSingleton::GetInstance();
p1->fun();

CSingleton* p1arr = new CSingleton[2];
return 0;
}

但是自己太菜,CSingleton* p1arr = new CSingleton[2];编译器会提示构造函数不可访问。
求助大家怎么能让new抛出异常呢?
[最优解释]
要么重载operator::new,直接throw badalloc。我觉得了解这个问题最好是知道里头到底是怎么一回事的,也就是说模拟它。你可以看effect c++,里头有详细的描述。
[其他解释]
#include <iostream>
using namespace std;

int main()
{
long n = 100000000000;

try
{
char * p = new char[n];
cout << static_cast<void *> (p) << endl;
}
catch (exception & e)
{
cout << e.what() << endl;
}
catch (...)
{
cout << "error" << endl;
}

return 0;
}

[其他解释]
引用:
要么重载operator::new,直接throw badalloc。我觉得了解这个问题最好是知道里头到底是怎么一回事的,也就是说模拟它。你可以看effect c++,里头有详细的描述。

++ 重载new好了。你想让它怎样抛它就怎样抛。这就是C++的好处。
#include<iostream>
using namespace std;

void* operator new(std::size_t) throw (std::bad_alloc){
        throw bad_alloc();
}
void operator delete(void* p) throw() {
}

int main() {
    try {
        char *p=new char(100);
    }
    catch(...) {
        cout << "throw "<< endl;
    }
}

[其他解释]
int main()
{
try
{
for(int i=0;i<100;++i)
{
char *p=new char[0x7fffffff];
}
}
catch(...)
{
cout <<"something catched" <<endl;
}

    return 0;
}

[其他解释]
new失败不一定会抛出异常啊

[其他解释]
写个无限循环去new?
------其他解决方案--------------------


new失败不一定会抛出异常啊
+++
[其他解释]
假设你没有超过200GB虚拟内存,上例必然抛出异常

热点排行