В одной части одной довольно широко известной БД используется штука под названием boost::ptr_vector. Хранит он массив указателей, приведённых к void
( Read more... )
Так там же вроде не сугубо двойное освобождение памяти, там просто битый указатель получается после удаления либо оригинала, либо "неглубокой-копии-для-бедных"? А как об него споткнутся, попыткой доступа к произвольному месту элемента в произвольный момент или повторным освобождением при завершении программы (или не при завершении) - это уж дело случая.
delete b; - это частный случай Вполне может упасть и об b->... Причём узнать, что кто-то уже сделал delete a; в произвольный момент в общем случае никак невозможно. Единственный пожалуй вариант, чтоб оно не падало где попало - обрезание "общих случаев" до совсем частных разного рода джентльменскими соглашениями типа "все delete только при завершении программы", но это несколько попахивает безумием.
Это собственно разница между техлидами, кто-то продумывает и навязывает какие-то полиси и практики, а кто-то пускает на самотёк под соусом "ну у нас же все программисты мирового класса, ну не могут же они" - и первый же залетевший дятел что-то там делает с цивилизацией.
Comments 19
Так там же вроде не сугубо двойное освобождение памяти, там просто битый указатель получается после удаления либо оригинала, либо "неглубокой-копии-для-бедных"? А как об него споткнутся, попыткой доступа к произвольному месту элемента в произвольный момент или повторным освобождением при завершении программы (или не при завершении) - это уж дело случая.
Reply
auto* b = a;
delete a;
delete b;Это вот оно, использование boost::ptr_vector с копированием между переменными.
Разница между программистами мирового уровня и обычными программистами в недопущении "дела случая," когда работают последние. ;)
Reply
delete b; - это частный случай
Вполне может упасть и об b->...
Причём узнать, что кто-то уже сделал delete a; в произвольный момент в общем случае никак невозможно. Единственный пожалуй вариант, чтоб оно не падало где попало - обрезание "общих случаев" до совсем частных разного рода джентльменскими соглашениями типа "все delete только при завершении программы", но это несколько попахивает безумием.
Это собственно разница между техлидами, кто-то продумывает и навязывает какие-то полиси и практики, а кто-то пускает на самотёк под соусом "ну у нас же все программисты мирового класса, ну не могут же они" - и первый же залетевший дятел что-то там делает с цивилизацией.
Reply
Все ссылки до этого момента живые и могут быть спокойно адресованы. Более того, копии живы, со всеми их ссылками (что живы).
А вот во время работы деструктора всё и проявляется. Двойное освобождение, нарушение защиты и так далее, и тому подобное. ;)
Reply
Leave a comment