Opened 6 years ago

Closed 6 years ago

#246 closed ожидается проверка (задача сдана)

HA3: linked_ptr

Reported by: Vladimir Nazarenko Owned by: rutsky,grabovoy.philipp
Priority: проверка Milestone: ha3-milestone2
Component: HA#3 linked_ptr Version: 1.0
Keywords: Cc:

Description

Доп. задание делал по образцу shared_ptr из gcc -- получается лишнее выделение памяти в куче при создании указателя и при ресете, не совсем понятно, подходит ли такая реализация под п.2 спецификации. Хотелось бы узнать, известно ли решение доп. задачи без дополнительных выделений памяти (в том числе в специальных аллокаторах, как это было рассказано на лекции).

Change History (17)

comment:1 Changed 6 years ago by cpptester

Type: ожидается проверкаожидаются исправления

Tested revision 248 by nazarenko.vladimir.

Smoke tests

test

stage

result

info

log

run_linked_ptr_gen_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

FAILURE

exit code 1

run_linked_ptr_gen_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

FAILURE

exit code 1

run_linked_ptr_gen_smoke_test-asan.log

clang-san

FAILURE

run_linked_ptr_gen_smoke_test-clang-san.log

run_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

FAILURE

exit code 1

run_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

FAILURE

exit code 1

run_smoke_test-asan.log

clang-san

FAILURE

run_smoke_test-clang-san.log

Common header used in some tests: common.h

comment:2 Changed 6 years ago by cpptester

Tested revision 258 by nazarenko.vladimir.

Smoke tests

test

stage

result

info

log

run_linked_ptr_gen_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

SUCCESS

run_linked_ptr_gen_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

SUCCESS

clang-san

FAILURE

run_linked_ptr_gen_smoke_test-clang-san.log

run_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

SUCCESS

run_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

SUCCESS

clang-san

FAILURE

run_smoke_test-clang-san.log

Common header used in some tests: common.h

comment:3 Changed 6 years ago by cpptester

Tested revision 259 by nazarenko.vladimir.

Smoke tests

test

stage

result

info

log

run_linked_ptr_gen_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

SUCCESS

run_linked_ptr_gen_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

SUCCESS

clang-san

FAILURE

run_linked_ptr_gen_smoke_test-clang-san.log

run_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

SUCCESS

run_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

SUCCESS

clang-san

FAILURE

run_smoke_test-clang-san.log

Common header used in some tests: common.h

comment:6 Changed 6 years ago by cpptester

Tested revision 264 by nazarenko.vladimir.

Smoke tests

test

stage

result

info

log

run_linked_ptr_gen_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

SUCCESS

run_linked_ptr_gen_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

SUCCESS

clang-san

FAILURE

run_linked_ptr_gen_smoke_test-clang-san.log

run_smoke_test.cpp

gcc62

SUCCESS

run

SUCCESS

valgrind

SUCCESS

run_smoke_test-valgrind.log

gcc62-asan

SUCCESS

asan

SUCCESS

clang-san

FAILURE

run_smoke_test-clang-san.log

Common header used in some tests: common.h

comment:7 Changed 6 years ago by cpptester

Tested revision 265 by nazarenko.vladimir.

All tests passed. Good job!

comment:8 Changed 6 years ago by Vladimir Nazarenko

Type: ожидаются исправленияожидается проверка

comment:9 Changed 6 years ago by Vladimir Rutsky

Milestone: ha3-milestone1ha3-milestone2
Type: ожидается проверкаожидаются исправления

Попробуйтесь обойтись без полного type erasure для делитера (и, соответственно, выделение делитера в динамической памяти) --- не обязательно хранить указатель на память, которую нужно удалить, можно передавать его из деструктора linked_ptr, а значит в качестве делитера можно хранить указатель на функцию с фиксированной сигнатурой. Осталось только корректно генерировать эти делитеры в нужном месте и нужным образом.

Исправьте, пожалуйста, в ближайшие 60 часов.

comment:10 Changed 6 years ago by Vladimir Rutsky

Ещё замечание: не используйтей виртуальные методы в linked_node --- наследование от этого класса это деталь реализации, и никто никогда не должен хранить указатель на linked_node (чтобы требовался виртуальный деструктор).

comment:11 Changed 6 years ago by Vladimir Rutsky

Ещё замечание: сравнение указателей с nullptr имеет undefined поведение, вы же предполагаете, что ненулевые указатели всегда будут больше nullptr.
Сравнивайте явно хранимый сырой указатель с объектом типа std::nullptr_t.

Tip: не обязательно указывать имя для аргумента типа std::nullptr_t, как вы это делаете в constexpr linked_ptr(std::nullptr_t).

comment:14 Changed 6 years ago by cpptester

Tested revision 485 by nazarenko.vladimir.

All tests passed. Good job!

comment:15 Changed 6 years ago by Vladimir Nazarenko

Спасибо!

Переделал делитер согласно совету, получилось элегатнто (и, надеюсь, корректно).
Убрал виртуальный деструктор.
Поправил операторы сравнения согласно этой статье https://stackoverflow.com/questions/28811034/using-stdless-with-nullptr -- насколько я понял, std::less немного предпочтительнее, чем просто оператор сравнения.

comment:16 Changed 6 years ago by Vladimir Nazarenko

Type: ожидаются исправленияожидается проверка

comment:17 Changed 6 years ago by Vladimir Rutsky

Resolution: задача сдана
Status: newclosed

Решение и бонусное задание зачтены.

Единственное замечания: я бы рекомендовал в template<typename U> linked_ptr &operator=(const linked_ptr<U> &other) брать делитер из other. В таком случае делитер всегда создаётся в месте, где сырой указатель кладётся в умный, и, например, можно было бы сделать его кастомизируемым пользователем.

Note: See TracTickets for help on using tickets.