2015-09-28 2 views
0

Я столкнулся с тем, что я рассматриваю странность в своем коде на C++, и мне любопытно узнать причину. Я перегрузил новую для класса Object и напечатал возвращаемое значение на консоли. Я также печатаю значение этого в конструкторе для Object. Эти значения не совпадают (они отличаются одним словом). Ожидается ли это?Значение, возвращаемое с перегрузки нового, и это не соответствует

void* Object::operator new(size_t size) 
    { 
     void* startAddress = ... 
     std::cout << "object starts at absolute address " << (int)startAddress << "\n"; 
     return startAddress; 
    } 

    Object(TypeId type) 
    { 
     _type = type; 
     std::cout << "this is address " << (int)this << "\n"; 

    } 

Выход:

object starts at absolute address 5164888 
this is address 5164896 
+2

vtable, вероятно, – BitTickler

+2

Можете ли вы показать минимальный пример, который компилирует, включая определение 'Object' и код, который вызывает' new'? – Brian

+0

Как вы назначаете 'startAddress'? – Barmar

ответ

2

new является исходным распределителем. Использование адреса и объема запрошенной памяти определяется реализацией.

В качестве примера можно отлаживать информацию или информацию о размере блока (количество уничтожаемых объектов) или (возможно, «Tricky», не знаю, как будут работать массивы). Все данные vtable могут быть помещены перед началом «фактического объекта» ».

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

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

Смежные вопросы