delete []
- что-то, что не new []
, ни ваше, строго противопоказано.
Посмотрите на эти строки:
uint8_t testBytes[] = {1, 2, 3, 4};
std::unique_ptr<uint8_t[]> testBytesPtr = std::make_unique<uint8_t[]>(4);
testBytesPtr.reset(testBytes);
Удаление нерелевантного эфемерного динамического распределения оставляет:
uint8_t testBytes[] = {1, 2, 3, 4};
std::unique_ptr<uint8_t[]> testBytesPtr(testBytes);
Что вызывает неопределенное поведение при включении dtor.
По общему признанию, вы перемещаете std::unique_ptr
один раз, но это просто сдвигает точную точку, где происходит взрыв.
(define bop list)
(define-syntax op
(syntax-rules ()
((op a b) (bop a b))
((op a b c ...) (op (bop a b) c ...))))
Например, (op 1 2 3 4)
расширяется до (bop (bop (bop 1 2) 3) 4)
и оценивает к (((1 2) 3) 4)
.
Функция Вы хотите обратиться к аргументам, должна самостоятельно быть аргументом макросу. Запрещая это, моим решением было то же.
#!r6rs
(import (rnrs base))
(define-syntax claudiu
(syntax-rules ()
((claudiu fun first second)
(fun first second))
((claudiu fun first second rest ...)
(claudiu fun (claudiu fun first second) rest ...))))
Чтобы показать, как ответ удается:
(op 1 2 3 4)
Это - op с 4 операторами, таким образом, 2-й случай выбран с a=1, b=2, c=3... =4:
(op (bop 1 2) 3 4)
Это - op с 3 операторами, так 2-й случай снова. = (танцуют бибоп 1 2), b=3, c=4:
(op (bop (bop 1 2) 3) 4)
Теперь это - бибоп с 2 операторами, таким образом, = (бибоп (бибоп 1 2) 3), b=4, и он сделан.