Пожалуйста, посмотрите код ниже:
unsigned char* p = new unsigned char[x];
CLASS* t = new (p) CLASS;
assert((void*)t == (void*)p);
Могу я предположить (void*)t == (void*)p
?
Пожалуйста, посмотрите код ниже:
unsigned char* p = new unsigned char[x];
CLASS* t = new (p) CLASS;
assert((void*)t == (void*)p);
Могу я предположить (void*)t == (void*)p
?
Да, ты можешь. Я считаю, что это гарантировано несколькими положениями.
# P3 ## P4 #
# P6 ## P9 ## P7 # # P8 #void* operator new(std::size_t size, void* ptr) noexcept;
Думаю, достаточно пообещать, что адреса одинаковые, даже если указатели вообще не взаимозаменяемы. Итак, согласно [expr.eq] / 1 (благодаря @TC):
Два указателя одного типа сравниваются как равные тогда и только тогда, когда они оба равны нулю, оба указывают на одну и ту же функцию или оба представляют один и тот же адрес ([basic.compound]).
Сравнение должно дать истину, опять же, потому что адреса совпадают.
T
оказывается массивом, я удаляю это.
- person StoryTeller - Unslander Monica; 09.01.2018
char
по любому объекту, как предполагается для памяти, возвращаемой operator new
.
- person StoryTeller - Unslander Monica; 09.01.2018
Могу я предположить
(void*)t == (void*)p
?
Не обязательно.
Например, если автор класса перегружает CLASS::operator new(size_t, unsigned char*)
, этот оператор может вернуть что-либо, кроме второго аргумента, например:
struct CLASS
{
static void* operator new(size_t, unsigned char* p) { return p + 1; }
};
Если вы хотите, чтобы это новое выражение вызывало стандартный оператор new для размещения без выделения ресурсов, код должен
<new>
.void*
аргумент.::
, чтобы обойти CLASS::operator new
, если таковой имеется.E.g.:
#include <new>
#include <cassert>
unsigned char p[sizeof(CLASS)];
CLASS* t = ::new (static_cast<void*>(p)) CLASS;
assert(t == static_cast<void*>(p));
В данном случае действительно t == static_cast<void*>(p)
.
Фактически, это то, что делает стандартная библиотека GNU C ++:
template<typename _T1, typename... _Args>
inline void _Construct(_T1* __p, _Args&&... __args) {
::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...);
}
T
не является массивом. - person HolyBlackCat   schedule 09.01.2018