Перегружен новый оператор, возвращающий пустую память для нового объекта каждый раз

Я пытаюсь каждый раз возвращать 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();, затем программа мгновенно завершает свою работу.

Теперь я хочу знать, есть ли способ обойти "новый оператор", чтобы не выделять память для объекта.

1 ответ

Этот код работает нормально (проверено с MSVC от VS2010) и всегда возвращает 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()Вы можете сделать так, чтобы ваша программа выходила более "контролируемым" способом (включая печать некоторых сообщений об ошибках).

Другие вопросы по тегам