我每次尝试从重载的新操作符函数返回NULL。这是我的程序
class xxx{
int n;
public:
void* operator new(size_t){
cout<<"in operator new"<<endl;
throw std::bad_alloc();
//return (void *)NULL; //LINE COMMENTED
}
};
int main(int argc,char *argv[])
{
xxx *x1=new xxx;
if(x1)
cout<<sizeof(x1);
else
cout<<"Unable to allocate memory"<<endl;
return 0;
}
如果我使用行return (void *)NULL;
,则会创建指针x1,而不是用于此程序。
如果我使用行throw std::bad_alloc();
,程序会立即终止/崩溃。
现在我想知道如果我们可以绕过&#34; new operator&#34;不为对象分配内存。
答案 0 :(得分:2)
此代码工作正常(使用VS2010中的MSVC进行测试)并始终根据您的问题中的要求返回nullptr
X
分配:
#include <iostream>
using namespace std;
class X {
public:
X() { cout << "X::X()" << endl; }
static void* operator new(size_t size) {
return nullptr;
}
};
int main() {
X* px = new X();
if (!px) {
cout << "Allocation returned nullptr." << endl;
} else {
cout << "Allocation succeeded." << endl;
delete px;
px = nullptr;
}
}
请注意,在现代C ++ 11中,您可能希望使用nullptr
而不是C ++ 98/03 NULL
。
另请注意,您在代码中使用的(void*)
广告无用。
此外,如果您在throw std:bad_alloc();
的自定义实现中使用new
,程序会“崩溃”,因为您会抛出一个永远不会被捕获的异常。
如果在try...catch(const std::exception&)
中插入main()
块,则可以以更“受控”的方式退出程序(包括打印一些错误消息)。