перегрузка новая / удалить

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

24
задан Donald Duck 15 September 2017 в 21:11
поделиться

5 ответов

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);
}
6
ответ дан dirkgently 15 September 2017 в 21:11
поделиться
  • 1
    Этот ответ не разъясняется. Если OP спрашивает, как включить что-то, you' ре ожидало принимать it' s отключенный. – Gui Imamura 17 July 2015 в 04:33

Возможно, можно сделать то, что Вы хотите с определенным волшебством препроцессора:

#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;
}
51
ответ дан kyku 15 September 2017 в 21:11
поделиться
  • 1
    Это чувствует немного hackish, но работает как очарование! – Freek de Bruijn 4 April 2015 в 21:10

Проблема полагается с двумя аргументами, что Вы добавили к перегруженному новому оператору. Попытайтесь делать имя файла и строку глобальными в некотором роде (или членские переменные, если Вы перегружаете новый и удаляете для единого класса). Это должно работать лучше.

4
ответ дан Benoît 15 September 2017 в 21:11
поделиться

Я думаю, что проблема здесь состоит в том, что профиль параметра Вашего new не соответствует профилю стандартного нового оператора, так, чтобы каждый не становился скрытым (и таким образом все еще используется).

Ваши профили параметра для нового и удаляют потребность быть похожими на это:

void* operator new(size_t);
void operator delete(void*, size_t);
12
ответ дан T.E.D. 15 September 2017 в 21:11
поделиться
  • 1
    Это - hackish. К сожалению, it' s единственный путь я заставил его работать: C – John Blackberry 5 April 2015 в 19:08

Вы вызываете перегруженный оператор правильно, т.е. передаете его дополнительные параметры?

4
ответ дан zvrba 15 September 2017 в 21:11
поделиться
  • 1
    Это работает отлично. НО, каждый раз, когда я обновляю Studio Android, он удалит tools.jar, и необходимо восстановить его. Просто предупреждение, так отметьте этот ответ. – Everett 17 September 2015 в 19:55
Другие вопросы по тегам:

Похожие вопросы: