перегрузка "нового" оператора - PullRequest
2 голосов
/ 09 декабря 2011

Пока я определял работу перегруженного нового оператора, объявленного в классе, Я наткнулся на следующую растерянность ....

  1. ЗДЕСЬ, тип возврата функции 'void', но я должны ввести оператор возврата ..... в противном случае моя программа падает .... почему так?
  2. Что подразумевается под "void * p"

    void *myclass::operator new(size_t size)
    {
    void *p;
    p=malloc(size);
    cout<<"IN overloaded new";
    if(!p)
    {
      bad_alloc ba;
      throw ba;
     }  
    return p;
    }
    

    к моменту уточнения.

Ответы [ 3 ]

6 голосов
/ 09 декабря 2011

Возвращаемый тип функции не void, это void * (указатель void). Указатель void - это обобщенный указатель, который может указывать на что угодно, но на него нельзя разыменовать - вы должны привести его к другому типу перед разыменованием.

Если вы не вернете пустоту *, то вы не вернете указатель на выделенную память, и код пользователя потерпит неудачу.

1 голос
/ 09 декабря 2011

void* - нетипизированный указатель.Это указатель, который может указывать на что угодно.Обратите внимание, что возвращаемый тип этой функции не void, а void*.Он должен возвращать указатель на выделенную память.

0 голосов
/ 26 августа 2013

Простая демонстрация перегруженного нового

void* operator new(size_t num)
{
 return malloc(num);
 }

Возвращаемый тип перегруженного нового должен быть недействительным *. Ожидается, что он вернет указатель на начало блока выделенной памяти. Здесь он возвращает void *, а не void (что означает, что ничего не возвращает).

...