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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 90
#1

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

11.04.2013, 22:09. Просмотров 1375. Ответов 20
Метки нет (Все метки)

Здравия желаю!

При запуске программы с кодом
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++):

New выделяет больше памяти, чем необходимо - C++
Мне нужно переписать из строки String (да, именно String) в динамический массив char, ибо String переменной длины. Выделяю память равную...

Трёхмерный вектор занимает в четыре раза больше памяти, чем должен - C++
Создаю трёхмерный вектор таким способом vector&lt;vector&lt;vector&lt;int&gt; &gt; &gt; dp; int n, k; void initializeVector () { dp.resize(n +...

Разработать программу, которая динамически выделяет 100 блоков памяти по 1000 байт каждый и освобождает их - C++
Всем привет. Подкинули на учебе вот такое задание - Напишите программу, которая динамически выделяет 100 блоков памяти по 1000 байт каж-дый...

Задано трехзначное число. Определить, какая из его цифр больше: первая или последняя. - C++
Задано трехзначное число. Определить, какая из его цифр больше: первая или последняя.

Задано натуральное число, разместить памяти последовательно все его цифры с помощью указателя - C++
Задано натуральное число, разместить их памяти последовательно все его цифры с помощью указателя.

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
w8me
496 / 11 / 1
Регистрация: 10.04.2013
Сообщений: 44
11.04.2013, 22:15 #2
strlen считает концом строки нуль-терминатор , new выделяет память не обнуляя её значение. И таким способом размер выделенной памяти узнать нельзя.
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
11.04.2013, 22:19 #3
я думаю это всё зависит от компилятора , вот смотри те на моё значение
Миниатюры
new выделяет больше памяти, чем задано  
TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 90
11.04.2013, 22:19  [ТС] #4
w8me, Благодарю.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
11.04.2013, 22:43 #5

Не по теме:

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



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

Не по теме:

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

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

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

Добавлено через 7 минут
OhMyGodSoLong, почему это не зависит от мусора?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
11.04.2013, 23:27 #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]);
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
11.04.2013, 23:40 #10
ValeryS, а что вы мне доказываете ? Я что сказал , что я не верю или ещё что то в этом роде ? Я говорю всего лишь , то , что у меня выдавала программа , да и ещё

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



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

CPP = g++.exe -D__DEBUG__
CC = gcc.exe -D__DEBUG__
и -g3. В меню Project/Project Options/Compiler/Linker выставлено
"Generate Debug Information"- "Yes", остальное- "No".
Игорь с++
434 / 457 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
12.04.2013, 00:13 #14
Цитата Сообщение от ValeryS Посмотреть сообщение
может пригодится?
Конечно , любая инфа ценна (особенно когда на халяву).Спасибо сейчас заценю.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.04.2013, 00:14 #15
добавить
Надо чтоб локальная для проекта опция "включать отладочную информацию" не соответствовала глобальной.
Т.е. идем в глобальные настройки, включаем там или выключаем отладочную инф., потом идем в локальные настройки проекта и ставим там эту опцию с точностью наоборот, запускаем под отладчиком, получаем вышеприведенное сообщение, нажимаем "Yes", все перестроиться, повторно запускаем под отладчиком и теперь нормально отлаживаемся... О как!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 00:14
Привет! Вот еще темы с ответами:

Realloc выделяет память для массива int и не выделяет память для массива double - C++
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main()...

Не могу понять в чем утечка памяти - C++
bool CAvPlatform::DetectGameFolderAccessRights() { DWORD DesiredAccess = FILE_GENERIC_WRITE; DWORD GrantedAccess = 0; ...

Морской бой: расставляется кораблей больше, чем положено - C++
Здравствуйте! Пишу игру &quot;Морской бой&quot; в консоли, и попалась одна неприятная ситуация. Есть функция заполнения поля случайными кораблями,...

char массив, get(), ввести больше символов чем в массиве - C++
#include &lt;iostream&gt; using std::cin; using std::cout; using std::endl; int main() { setlocale(LC_ALL,&quot;&quot;); char...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.04.2013, 00:14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru