Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
void* ptr = new void[size];
не Может сделать этого. Зафиксируйте его.
Никогда попытка не перегрузиться новый/удаляющий глобально. Или имейте их в базовом классе и получите все свои объекты из этого класса или используйте пространство имен или шаблонный параметр средства выделения. Да ведь можно спросить. Поскольку в случае, если Ваша программа является больше, чем единственный файл и STL использования или другие библиотеки, Вы собираетесь завинтить.
Вот дистиллированная версия new
оператор от VS2005 new.cpp
:
void * operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
Возможно, можно сделать то, что Вы хотите с определенным волшебством препроцессора:
#include <iostream>
using namespace std;
void* operator new (size_t size, const char* filename, int line) {
void* ptr = new char[size];
cout << "size = " << size << " filename = " << filename << " line = " << line << endl;
return ptr;
}
#define new new(__FILE__, __LINE__)
int main() {
int* x = new int;
}
Проблема полагается с двумя аргументами, что Вы добавили к перегруженному новому оператору. Попытайтесь делать имя файла и строку глобальными в некотором роде (или членские переменные, если Вы перегружаете новый и удаляете для единого класса). Это должно работать лучше.
Я думаю, что проблема здесь состоит в том, что профиль параметра Вашего new не соответствует профилю стандартного нового оператора, так, чтобы каждый не становился скрытым (и таким образом все еще используется).
Ваши профили параметра для нового и удаляют потребность быть похожими на это:
void* operator new(size_t);
void operator delete(void*, size_t);
Вы вызываете перегруженный оператор правильно, т.е. передаете его дополнительные параметры?