重载的new运算符每次都为新对象返回NULL内存

时间:2014-04-06 19:23:11

标签: c++ new-operator c++98

我每次尝试从重载的新操作符函数返回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;不为对象分配内存。

1 个答案:

答案 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()块,则可以以更“受控”的方式退出程序(包括打印一些错误消息)。