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