Форум программистов, компьютерный форум CyberForum.ru

new выделяет больше памяти, чем задано - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
TempuSFatumA
 Аватар для TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 87
11.04.2013, 22:09     new выделяет больше памяти, чем задано #1
Здравия желаю!

При запуске программы с кодом
C++
1
2
3
4
5
6
7
8
void main()
{
    char *p;
    p=new char[5];
    cout<<strlen(p);
    _getch();
    delete []p;
}
вывод: 24.

Если при отладке посмотреть значение переменной получается массив из символов НННННээээ<<<<<<<<юоюоюою (как раз 24). Количество Н совпадает с размером нужной для выделения памяти. Почему так происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 22:09     new выделяет больше памяти, чем задано
Посмотрите здесь:

C++ Задано трехзначное число. Определить, какая из его цифр больше: первая или последняя.
Подсчитать во сколько раз русских букв больше чем английских C++
char массив, get(), ввести больше символов чем в массиве C++
Определить, что положительных чисел больше, чем отрицательных C++
Определить, встречается ли цифра M в числе Р больше чем 2 раза C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
11.04.2013, 22:15     new выделяет больше памяти, чем задано #2
strlen считает концом строки нуль-терминатор , new выделяет память не обнуляя её значение. И таким способом размер выделенной памяти узнать нельзя.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
11.04.2013, 22:19     new выделяет больше памяти, чем задано #3
я думаю это всё зависит от компилятора , вот смотри те на моё значение
Миниатюры
new выделяет больше памяти, чем задано  
TempuSFatumA
 Аватар для TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 87
11.04.2013, 22:19  [ТС]     new выделяет больше памяти, чем задано #4
w8me, Благодарю.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
11.04.2013, 22:43     new выделяет больше памяти, чем задано #5

Не по теме:

Цитата Сообщение от Игорь с++ Посмотреть сообщение
я думаю это всё зависит от компилятора
Всё зависит от мусора, который окажется в выделенной памяти



Добавлено через 6 минут

Не по теме:

Цитата Сообщение от TempuSFatumA Посмотреть сообщение
Количество Н совпадает с размером нужной для выделения памяти. Почему так происходит?
Во время отладки выделенная память может быть инициализирована каким-то значением для контроля выхода за пределы, использования не инициализированных переменных и т.д.

Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
11.04.2013, 23:08     new выделяет больше памяти, чем задано #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Всё зависит от мусора, который окажется в выделенной памяти
При всём моём уважении позвольте возразить , я вам верю , но я верю и своим глазам , а именно - я несколько раз запускал программу результат один и тот же , затем я пробывал запускать разные программы и эту тоже и результат был тот же , затем я перезагрузил компьютер и при загрузке не запуская не чего , запустил программу , опять же результат один и тот же .
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
11.04.2013, 23:10     new выделяет больше памяти, чем задано #7
А теперь соберите без отладочных ключей и с оптимизациями.

И вообще. Это не "зависит от компилятора. Это не "зависит от мусора". Это неопределённое поведение, потому здесь вообще не может быть чего-то невозможного, любое поведение программы допустимо.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.04.2013, 23:18     new выделяет больше памяти, чем задано #8
Игорь с++, везение. Чистое везение.

Добавлено через 7 минут
OhMyGodSoLong, почему это не зависит от мусора?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
11.04.2013, 23:27     new выделяет больше памяти, чем задано #9
Цитата Сообщение от Игорь с++ Посмотреть сообщение
При всём моём уважении позвольте возразить , я вам верю , но я верю и своим глазам , а именно - я несколько раз запускал программу результат один и
А ты думаешь мусор каждый раз разный?
В отладочной версии происходит иницализация памяти служебными значениями
плюс new действительно в отладочной версии выделяет больше памяти
5 байт твоих и защитный блок (это сделано для того чтобы программа не рухнула когда ты выйдешь за пределы)
размер блока тайна известная компилятору
попробуй что нибудь записать по адресу p[5];
и увидишь больше тебе выделили памяти или нет
но все меняется когда приходит релиз
защитных блоков нет, оптимизация, память никто не чистит и твой размер будет меняться в зависимости от погоды на Марсе

Добавлено через 4 минуты
кстати new действительно может выделить больше памяти
выравнивать будет до кратному четырем
а может не будет
закладываться на это нельзя

Добавлено через 3 минуты
хочешь увидеть защитные блоки сделай так
C++
1
2
3
char t=new char[5];
for (int i=-20; i>30;i++)
 printf("%x ",p[i]);
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
11.04.2013, 23:40     new выделяет больше памяти, чем задано #10
ValeryS, а что вы мне доказываете ? Я что сказал , что я не верю или ещё что то в этом роде ? Я говорю всего лишь , то , что у меня выдавала программа , да и ещё

Цитата Сообщение от ValeryS Посмотреть сообщение
В отладочной версии
если вы заметили на скрине , я писал на Dev-cpp и там нет Debug
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
11.04.2013, 23:48     new выделяет больше памяти, чем задано #11
Цитата Сообщение от Игорь с++ Посмотреть сообщение
я писал на Dev-cpp и там нет Debug
ну попробуй посмотреть вот это
Project -> Project Options -> Compiler -> Linker -> Generate debugging information -> Yes.
и все опции оптимизации поставить в No (Project -> Project Options -> Compiler -> Optimization)
а дальше кнопочку
F8(отладка)
хотя по серьезному я с ним не работал



Цитата Сообщение от Игорь с++ Посмотреть сообщение
если вы заметили на скрине
я заметил что выделил 5 байт а на экране 3
Цитата Сообщение от Игорь с++ Посмотреть сообщение
ValeryS, а что вы мне доказываете ?
я рассказываю почему появляются те или иные значения
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.04.2013, 00:01     new выделяет больше памяти, чем задано #12
ValeryS, да я и так всё понял , а именно - может быть всё что угодно , и меньше и больше . А про dev-cpp спасибо сколько работал , а что то как то не заморачивался и не смотрел
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
12.04.2013, 00:09     new выделяет больше памяти, чем задано #13
Игорь с++, посмотри вот нарыл на своих старых закладках
может пригодится?
Опиции компиллера видны в логе компиляции в одном из окошек и в "Makefile.win". У меня стандартно там:

CPP = g++.exe -D__DEBUG__
CC = gcc.exe -D__DEBUG__
и -g3. В меню Project/Project Options/Compiler/Linker выставлено
"Generate Debug Information"- "Yes", остальное- "No".
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.04.2013, 00:13     new выделяет больше памяти, чем задано #14
Цитата Сообщение от ValeryS Посмотреть сообщение
может пригодится?
Конечно , любая инфа ценна (особенно когда на халяву).Спасибо сейчас заценю.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
12.04.2013, 00:14     new выделяет больше памяти, чем задано #15
добавить
Надо чтоб локальная для проекта опция "включать отладочную информацию" не соответствовала глобальной.
Т.е. идем в глобальные настройки, включаем там или выключаем отладочную инф., потом идем в локальные настройки проекта и ставим там эту опцию с точностью наоборот, запускаем под отладчиком, получаем вышеприведенное сообщение, нажимаем "Yes", все перестроиться, повторно запускаем под отладчиком и теперь нормально отлаживаемся... О как!
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.04.2013, 00:23     new выделяет больше памяти, чем задано #16
Цитата Сообщение от ValeryS Посмотреть сообщение
О как!
Ага шайтан машина
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
12.04.2013, 00:27     new выделяет больше памяти, чем задано #17
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Ага шайтан машина
Это не я
это цитаты со сторонних форумов
я же поставил, побаловался и... вернулся на VS2008
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
12.04.2013, 00:32     new выделяет больше памяти, чем задано #18
Оно может и выделяет 5 байт, только strlen'ом узнать это нельзя. Размер выделенной памяти можно узнать только если ф-я блокирует всю память вокруг этого участка , на вылете из него можно будет узнать его точный размер.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
12.04.2013, 00:36     new выделяет больше памяти, чем задано #19
Цитата Сообщение от w8me Посмотреть сообщение
Оно может и выделяет 5 байт,
А может не выделяет когда стоит выравнивание может выделить 8
но дальше 5 не пустит

Добавлено через 1 минуту
Цитата Сообщение от w8me Посмотреть сообщение
Размер выделенной памяти можно узнать только если ф-я блокирует всю память вокруг
в дебаге блокирует (я про VS) а в релизе нет и весь алгоритм может рухнуть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 00:39     new выделяет больше памяти, чем задано
Еще ссылки по теме:

Морской бой: расставляется кораблей больше, чем положено C++
Задано число. Разместите в памяти последовательно все его цифры, используя указатели и операции над ними C++
Не могу понять в чем утечка памяти C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
12.04.2013, 00:39     new выделяет больше памяти, чем задано #20
Согласен , new выделяет память с помощью HeapAlloc , а msdn насчет его выравнивая молчит
Цитата Сообщение от ValeryS Посмотреть сообщение
в дебаге блокирует (я про VS) а в релизе нет и весь алгоритм может рухнуть
Так здесь они вроде и пытаются померять размер кучки которой им выделили
Для такой задачи нужен крах
Yandex
Объявления
12.04.2013, 00:39     new выделяет больше памяти, чем задано
Ответ Создать тему
Опции темы

Текущее время: 13:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru