![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
rp80 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Копирование указателя на объект не приводит к копированию объекта.
Значит следующий код приведет к утечки памяти:
Правильно копировать так:
А что происходит при копировании переменных в стеке?
Теряется ли память выделенная первоначально под s? |
|
|
![]() |
ilyabvt |
![]()
Сообщение
#2
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Правильно копировать так:
Не правильно. sizeof(cc) вернет размер указателя, а не массива. В данном случае это сработает только по тому что вы создали 4-х байтный массив. Цитата а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. ![]() Сообщение отредактировал ilyabvt - 22.12.2011, 17:50 |
|
|
Iron Bug |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. ![]() нет. сегмент кода не может менять содержимое ни в одной из современных осей. это главное правило: код не может модифицировать сам себя. это только в DOSе можно было писать такие кренделя. любая защищённая система этого не позволяет. модифицировать можно исполняемый файл, например. или в отладчике писать какие-то значения в регистры. или подгружать какие-то библиотеки на ходу. но сама программа себя менять никак не может. просто нет прав на запись в сегмент кода. Хорошо, а где хранятся данные переменных? В самом стеке? И в примере с чтением из файла в какой-то момент будет переполнение стека, если файл достаточно большой? смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных. Сообщение отредактировал Iron Bug - 22.12.2011, 20:33 |
|
|
rp80 |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных. Вообще вот цитата из википедии: A data segment is a portion of virtual address space of a program, which contains the global variables and static variables that are initialized by the programmer. Т.е. они называют сегментом данных то что вы называете сегментом кода. Непонятно кто прав.. А насчет утечек вот пример
Работает, не падает, разве это не говорит об утечке? Блок закрылся, переменная ar удалена из стека, но выделенный массив остался в памяти. И если я меняю размер массива на 10, то размер экзешника уменьшается (18693 на 18677). Т.е. похоже на то, что данные хранятся в коде. Но тогда получается что такой неявно заданный объект тоже хранит данные в сегменте кода. И везде где я читаю пишут что есть 3 типа памяти: Сегмент кода - хранит текст программы + константы и статик переменные. Стэк - хранит локальные переменные. Куча - хранит динамические переменные. Нигде не видел упоминание о сегменте данных как о 4ом виде памяти, связанном со стеком. Сообщение отредактировал rp80 - 22.12.2011, 23:25 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 9.6.2025, 0:36 |