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
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 6 years ago by
Tested revision 258 by nazarenko.vladimir.
Smoke tests
test | stage | result | info | log |
---|---|---|---|---|
gcc62 | SUCCESS | |||
run | SUCCESS | |||
valgrind | SUCCESS | |||
gcc62-asan | SUCCESS | |||
asan | SUCCESS | |||
clang-san | FAILURE | |||
gcc62 | SUCCESS | |||
run | SUCCESS | |||
valgrind | SUCCESS | |||
gcc62-asan | SUCCESS | |||
asan | SUCCESS | |||
clang-san | FAILURE | |||
Common header used in some tests: common.h
comment:3 Changed 6 years ago by
Tested revision 259 by nazarenko.vladimir.
Smoke tests
test | stage | result | info | log |
---|---|---|---|---|
gcc62 | SUCCESS | |||
run | SUCCESS | |||
valgrind | SUCCESS | |||
gcc62-asan | SUCCESS | |||
asan | SUCCESS | |||
clang-san | FAILURE | |||
gcc62 | SUCCESS | |||
run | SUCCESS | |||
valgrind | SUCCESS | |||
gcc62-asan | SUCCESS | |||
asan | SUCCESS | |||
clang-san | FAILURE | |||
Common header used in some tests: common.h
comment:4 Changed 6 years ago by
Tested revision 260 by nazarenko.vladimir.
Main tests
test | stage | result | info | log |
---|---|---|---|---|
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
Common header used in some tests: common.h
comment:5 Changed 6 years ago by
Tested revision 261 by nazarenko.vladimir.
Main tests
test | stage | result | info | log |
---|---|---|---|---|
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
gcc62 | FAILURE | |||
Common header used in some tests: common.h
comment:6 Changed 6 years ago by
Tested revision 264 by nazarenko.vladimir.
Smoke tests
test | stage | result | info | log |
---|---|---|---|---|
gcc62 | SUCCESS | |||
run | SUCCESS | |||
valgrind | SUCCESS | |||
gcc62-asan | SUCCESS | |||
asan | SUCCESS | |||
clang-san | FAILURE | |||
gcc62 | SUCCESS | |||
run | SUCCESS | |||
valgrind | SUCCESS | |||
gcc62-asan | SUCCESS | |||
asan | SUCCESS | |||
clang-san | FAILURE | |||
Common header used in some tests: common.h
comment:7 Changed 6 years ago by
Tested revision 265 by nazarenko.vladimir.
All tests passed. Good job!
comment:8 Changed 6 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:9 Changed 6 years ago by
Milestone: | ha3-milestone1 → ha3-milestone2 |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Попробуйтесь обойтись без полного type erasure для делитера (и, соответственно, выделение делитера в динамической памяти) --- не обязательно хранить указатель на память, которую нужно удалить, можно передавать его из деструктора linked_ptr
, а значит в качестве делитера можно хранить указатель на функцию с фиксированной сигнатурой. Осталось только корректно генерировать эти делитеры в нужном месте и нужным образом.
Исправьте, пожалуйста, в ближайшие 60 часов.
comment:10 Changed 6 years ago by
Ещё замечание: не используйтей виртуальные методы в linked_node
--- наследование от этого класса это деталь реализации, и никто никогда не должен хранить указатель на linked_node
(чтобы требовался виртуальный деструктор).
comment:11 Changed 6 years ago by
Ещё замечание: сравнение указателей с nullptr
имеет undefined поведение, вы же предполагаете, что ненулевые указатели всегда будут больше nullptr
.
Сравнивайте явно хранимый сырой указатель с объектом типа std::nullptr_t
.
Tip: не обязательно указывать имя для аргумента типа std::nullptr_t
, как вы это делаете в constexpr linked_ptr(std::nullptr_t)
.
comment:12 Changed 6 years ago by
Tested revision 483 by nazarenko.vladimir.
Main tests
Common header used in some tests: common.h
comment:13 Changed 6 years ago by
Tested revision 484 by nazarenko.vladimir.
Main tests
test | stage | result | info | log |
---|---|---|---|---|
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
FAILURE | ||||
Common header used in some tests: common.h
comment:14 Changed 6 years ago by
Tested revision 485 by nazarenko.vladimir.
All tests passed. Good job!
comment:15 Changed 6 years ago by
Спасибо!
Переделал делитер согласно совету, получилось элегатнто (и, надеюсь, корректно).
Убрал виртуальный деструктор.
Поправил операторы сравнения согласно этой статье https://stackoverflow.com/questions/28811034/using-stdless-with-nullptr -- насколько я понял, std::less немного предпочтительнее, чем просто оператор сравнения.
comment:16 Changed 6 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:17 Changed 6 years ago by
Resolution: | → задача сдана |
---|---|
Status: | new → closed |
Решение и бонусное задание зачтены.
Единственное замечания: я бы рекомендовал в template<typename U> linked_ptr &operator=(const linked_ptr<U> &other)
брать делитер из other
. В таком случае делитер всегда создаётся в месте, где сырой указатель кладётся в умный, и, например, можно было бы сделать его кастомизируемым пользователем.
Tested revision 248 by nazarenko.vladimir.
Smoke tests
test
stage
result
info
log
run_linked_ptr_gen_smoke_test.cpp
gcc62
run
valgrind
exit code 1
run_linked_ptr_gen_smoke_test-valgrind.log
gcc62-asan
asan
exit code 1
run_linked_ptr_gen_smoke_test-asan.log
clang-san
run_linked_ptr_gen_smoke_test-clang-san.log
run_smoke_test.cpp
gcc62
run
valgrind
exit code 1
run_smoke_test-valgrind.log
gcc62-asan
asan
exit code 1
run_smoke_test-asan.log
clang-san
run_smoke_test-clang-san.log
Common header used in some tests: common.h