170 похожих чатов

Мне кажется, что по идее, кто там выделяет память он

разве не записывает в какую то таблицу, что вот я выделил по началу этого участка памяти столько то байт, если потом сделать delete этому указателю, по идее тому кто память освобождает должно быть без разницы какого типа этот указатель, он просто смотрит сколько он выделил байт ранее. Разве не так? Я где то читал, что когда работает delete Он берет еще откуда то служебную информацию сколько было выделено. Получается ему без разницы хоть ты сделаешь delete указателю на void. Это были мои мысли вслух, допускаю, что я не прав, но просто интересно, к то в теме прокомментируйте, пожалуйста.

13 ответов

24 просмотра

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

передача указателя куда либо уже не безопасно, потому что с этим указателем можно делать все что угодно, включая и delete. Если после делита обратится по указателю, то это уб, конечная. Поэтому лучше использовать умный указатель для такого, шаред птр следит сколько есть владельцев у указателя и сам его уничтожает, когда владельцев становится 0

The Pressbraker- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
передача указателя куда либо уже не безопасно, пот...

Это понятно. Я про факт отдачи этого участка памяти обратно системе. Интересно как это работает, он смотрит какой тип когда делает delete или смотрит сколько байт освободить в какой то своей таблице

The Pressbraker
Это понятно. Я про факт отдачи этого участка памят...

да, делит нормально отработает, просто в месте где ты сделал new останется указатель на то, что ты высвободил 🌚

Aniki Hi$ok@ 🌈 Z 🐀
да, делит нормально отработает, просто в месте где...

или ты передал этот указатель в 2 обьекта, и во втором обьекте тоже будет "провисший" указатель

The Pressbraker- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
или ты передал этот указатель в 2 обьекта, и во вт...

Это понятно, да. Обычно еще после delete лучше подстраховатьтся и присвоить указателю nullptr, тогда ты потом проверяешь на nullptr и понимаешь этот указатель не надо использовать.

The Pressbraker
Это понятно, да. Обычно еще после delete лучше под...

а это уже фокусы и подражание умному указателю, который уже придуман и доступен для использования

The Pressbraker- Автор вопроса
Aniki Hi$ok@ 🌈 Z 🐀
да, делит нормально отработает, просто в месте где...

Если я этот указатель много куда скопировал до этого, то да, это плохо! Лучше так не делать!

The Pressbraker- Автор вопроса

Я кажется понял как это работает. Если мы сделаем new Производный класс и положим его в указатель базового класса (или даже просто в указатель на void), то в принципе, когда мы сделаем delete этому указателю, то сама память то освободится. Проблема то более тонкая, дело в том, что в этом куске памяти могли храниться указатели, которые, в свою очередь могли указывать на другие куски памяти в куче. То есть нам недостаточно просто взять и удалить кусок памяти, который занимают члены. Нам надо удалить все куски памяти, на которые могут ссылаться члены. Именно для этого и нужны деструкторы, а виртуальный деструктор нужен, чтоб не просто очистить память занимаемую членами, а заставить как у базового, так и у производного класса, если у него есть в составе указатели, то чтоб вызвался его деструктор тоже, что в свою очередь вызовет очистку тех участков памяти, на которые ссылаются члены-указатели производного класса.

The Pressbraker
Я кажется понял как это работает. Если мы сделаем...

Теперь осталось про умные указатели прочитать и new / delete будет не нужен.

The Pressbraker- Автор вопроса
serfcity -fsanitize=undefined,address
Теперь осталось про умные указатели прочитать и ne...

Я сначала подумал, что ты неправ. Через какое то время, я осознал, что ты прав, от new можно отказаться, а использовать make функции, что возвращают указатель, положенный внутрь умного указателя.

The Pressbraker
Я сначала подумал, что ты неправ. Через какое то в...

Не можно, а нужно. new нужен только в двух случаях: для placement и для нестандартных параметров типа выравнивания больше, чем требуют размещаемые в динамической памяти объекты. Для всего остального всегда make_smartpointer функции.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта