Другие языки программирования и технологии

С++ Указатели, утечка памяти и т. д.

Что обозначает данная запись, что собственно она делает?

int var = 100;
int * ptr = &var;

Правильно ли я понимаю, что здесь не происходит выделения памяти?
Так я попробовал запустить программу в которой в цикле из 100тыс итераций меняются адреса, но никакого приращения памяти в таскМенеджере я не увидел вообще... когда как если бы это было бы выделение через new, тогда все эти выделения дают прирост аж почти в 5Мб, хотя по подсчетам для 32 битной программы утечка должна быть в размере 4 байта * 100000 выделений = 400тыс байтов, что составляет всего ~0.4 Мб Против 5. Разница более чем в 12 раз... Но это уже второй вопрос, из каких соображений получилась такая утечка)))
Hursand Saburow
Hursand Saburow
10 755
int var = 100;
int * ptr = &var;

Правильно ли я понимаю, что здесь не происходит выделения памяти?
Ну как бы не совсем так...
int var - это будет занимать сколько то места но не менее 16 бит по спецификации
int *ptr - и это тоже будет занимать сколько то места, а тут для 32 разрядной будет 32 бита, а для 64 разрядной 64 бита занимать, если не ошибаюсь.

Едем далее по вопросу... Если запихнуть это в цикл или в функцию, да в принципе куда угодно, выделится только две переменные это переменная int и указатель на int(имена не вижу смысла писать и так понятно что есть что). Так что проверки этого в цикле не вижу смысла.
Что же по второму вопросу. Уже все не помню, нужно проверять сказанное мной после этой фразы. При выделении памяти при помощи new выделяется памяти больше чем требуется и адрес памяти будет кратен 16(выравнивание данных на адрес кратный 16 помогает процессору быстрей обращаться к данным) Поэтому попробуйте выделять память по 4 int или числу кратному 16 байт и понаблюдать за результатом. Плюс вопрос а как сохраняются указатели на выделенную память!? Они же тоже чего-то весят...
Как видим на скрине я оказался прав и выравнивание происходит на 16(нолики в конце у всех адресов стоят) А минимальный размер памяти между указателями составил 0x20 то есть 32 байта - это минимум видимо что может выделить new или винда, тут хз кто так решает. Так что при выделении 4 байт вы получаете минимум 32 байта, то есть в 8 раз больше. Так что не выделяйте память такими мелкими кусочками. И да 32*100000 = 3200000 и это чуть больше чем 3Мб, осталось понять куда 2Мб девалось!)))
Роман Чечен
Роман Чечен
15 408
Лучший ответ
Эта программа в Release x86 занимает 508 kB

#include <cstdlib>
int main() {
//static short n = 100'000;
//do new int; while (--n);
system("pause");
}

Эта программа в Release x86 занимает 1068 kB

#include <cstdlib>
int main() {
static short n = 100'000;
do new int; while (--n);
system("pause");
}

Разница составляет 560 kB, их которых около 390 kB составляет утечка.
Вы же свою программу запускаете в режиме отладки.
Рома Плетінка В комментах как раз писал - запустите в релизе с оптимизацией.
Есс-но идеала никогда не достичь. В т. ч. из-за накладных расходов выделение памяти страницами/параграфами и т.. д.
Hursand Saburow Да, я попробовал в релизе у меня утечка снизилась в несколько раз. правда все равно она не получается 4*100'000 . Люди говорят, что это тип накладные расходы.... при чем для 1млн итераций тенденция сохраняется.... на каждое выделение посути у меня блокируется около 13 байт памяти даже при оптимизации О2 и в релизе
Hursand Saburow А как у вас так получилось? Чем вы измеряете утечку? (Через диспетчер тож?) и с каким режимом оптимизации вы компилировали?
никакая это не утечка, а просто особенность работы системы. курсором достаточно повести и память может увеличиться.
RB
Rasim Bakili Dj
30 070
Hursand Saburow у меня консольное приложение. Ничего кроме утечек в нем и нет. Если на то пошло, тогда и в первом случае должен был наблюдаться рост оперативной памяти по приложению, но этого не было, так как утечки там нет.
выделение памяти здесь происходит только в стеке как при обычной переменной. когда дойдет до } очистится сама.
Улан Нусипхожа Здесь не происходит выделения памяти вообще. Память на стеке выделяется перед выполнением.
Улан Нусипхожа Утечка происходит только на время выполнения программы, кстати.
Таким образом как ты, никто количество памяти не мерит.
Определение переменной - это всегда выделение памяти для этой переменной. В вашем обрывке кода присутствует определение двух переменных, т. е. производится выделение памяти для них.

Из вашего обрывка кода, однако, не ясно, в каком контексте сделаны эти объявления, т. е. невозможно ответить на вопрос, являются ли эти переменные статическими или автоматическими. Но в любом случае, менеджмент памяти для статических или автоматических переменных делается языком. Вам от этом беспокоиться не нужно. Никакой утечки памяти в этом коде нет.

Утечка памяти возможна только при динамическом выделении памяти. В приведенном вами коде никакого динамического выделения памяти нет.
Yoqubjon Navruzo'v
Yoqubjon Navruzo'v
248
Рома Плетінка Далеко не всегда. В т. ч. переменная может быть оптимизирована до напрямую работы с регистрами процессора.
Улан Нусипхожа Не выделение памяти, а создание переменной, без всяких выделений. Во время выполнения память выделяется только в куче.

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