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

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

Войти
Регистрация
Восстановить пароль
 
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
#1

Непонятная логика работы оператора new - C++

02.06.2014, 15:08. Просмотров 300. Ответов 9
Метки нет (Все метки)

Нужно было освежить в памяти работу с оператором new.
Использую Microsoft Visual Studio 2010 Express.
Сделал простой пример, чтобы все проверить и был шокирован:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int test1 = *new int[2];
    int test2 = *new int[1];
    float *test3 = new float[5];
    char *test4 = new char[10];
    test4 = "khgsdlifgslfibsflihsp;oduhs;dogjnsd;obs;fousouhf;siugfspeufhbsp;ifbslibgskufgsolfdgslidfbslfsdlfsldfvsldf";
    test3[0] = 0;
    test3[1] = 1;
    test3[2] = 5;
    test3[8] = 8;
    int size1 = sizeof(test1);
    int size2 = sizeof(test2);
    int size3 = sizeof(test3);
    int size4 = sizeof(test4);
1) По какой-то причине, sizeof мне показывает, что и test1 и test2 по размеру равны 4 байтам. Почему??? Каким образом можно узнать размер выделенной памяти под переменную?
2) Я выделил для массива char 10 байт. Засунул туда длиннющую строку и не получил ошибки. Разве меня не должно было выкинуть с ошибкой переполнения? Я полез в незамапленную память! И мне никто ничего не сказал...

Народ, разъясните пожалуйста что к чему! =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2014, 15:08     Непонятная логика работы оператора new
Посмотрите здесь:

Ищу 2 оператора для работы с файлами - C++
1)Оператор,который возвращает кол-во строк в текстовом файле 2)Оператор,который позволяет перемещаться в файле на указанную строку . ...

Подскажите логику работы оператора при такой записи - C++
Здравствуйте ,подскажите логику работы оператора при такой записи,какое же здесь условие : If(A||B) { .... }

Перегрузка оператора минус для матриц. Программа зависает в конце своей работы - C++
Написал программу на перегрузку оператора минус для матриц. Например: беру 3 объекта класса matr D=A-B; Всё работает;вычтет из...

Сочетания оператора цикла и условного оператора - C++
вывести на экран все числа a от до b , кратные некоторому числу c

Логика switch - C++
Программа должна расчитывать количество проданного товара, суть проблемы, кода вместо численных значений в вариантах case я использую...

Логика выражения - C++
Изучать С начал недавно, изучение изучением, а вопрос текущий назрел и в литературе когда появится ответ, не особо известно) В общем...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 15:19     Непонятная логика работы оператора new #2
Цитата Сообщение от Divergence Посмотреть сообщение
По какой-то причине, sizeof мне показывает, что и test1 и test2 по размеру равны 4 байтам.
Размер указателя.
Цитата Сообщение от Divergence Посмотреть сообщение
Каким образом можно узнать размер выделенной памяти под переменную?
Никаким.

Добавлено через 1 минуту
Цитата Сообщение от Divergence Посмотреть сообщение
Я выделил для массива char 10 байт. Засунул туда длиннющую строку
Не туда. Та память потеряна, а указатель теперь связан со строковым литералом.

Добавлено через 3 минуты
С test3 нужно сделать:
C++
1
delete [] test3;
чтобы получить ошибку.
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
02.06.2014, 15:19  [ТС]     Непонятная логика работы оператора new #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Не туда. Та память потеряна, а указатель теперь связан со строковым литералом.
Спасибо за ответ!
А как мне добавить строку из букв именно в выделенную, оператором new, память?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 15:21     Непонятная логика работы оператора new #4
Цитата Сообщение от Divergence Посмотреть сообщение
А как мне добавить строку из букв именно в выделенную, оператором new, память?
Копировать (strcpy()).
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
02.06.2014, 15:23     Непонятная логика работы оператора new #5
Цитата Сообщение от Divergence Посмотреть сообщение
А как мне добавить строку из букв именно в выделенную, оператором new, память?
strcpy не прокатит?)

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Цитата Сообщение от Divergence Посмотреть сообщение
Каким образом можно узнать размер выделенной памяти под переменную?
Никаким.
где-то вроде мне попадалось на глаза что это можно как-то делать, сейчас поищу в книге
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 15:35     Непонятная логика работы оператора new #6
Цитата Сообщение от dzrkot Посмотреть сообщение
strcpy не прокатит?)
Очень даже прокатит:
C++
1
2
3
    char *test4 = new char[10];
    strcpy(test4, "khgsdlifg");
    cout << test4 << endl;
Добавлено через 1 минуту
Цитата Сообщение от dzrkot Посмотреть сообщение
где-то вроде мне попадалось на глаза что это можно как-то делать,
Кривые способы есть, но не всегда будут работать.

Добавлено через 5 минут
Вот это в студии, в debug, будет работать (в release уже нет):
C++
1
2
    char *test4 = new char[10];
    cout << ((int*)(test4))[-4] << endl;
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
02.06.2014, 16:46     Непонятная логика работы оператора new #7
Цитата Сообщение от Divergence Посмотреть сообщение
По какой-то причине, sizeof мне показывает, что и test1 и test2 по размеру равны 4 байтам. Почему???
Потому что они являются переменными типа int, а не указателями!
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 17:01     Непонятная логика работы оператора new #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Размер указателя.
Это я про sizeof(test3), sizeof(test4) написал.
Цитата Сообщение от Ilot Посмотреть сообщение
Потому что они являются переменными типа int, а не указателями!
А если бы указателями, то sizeof() разное выдал бы?
Divergence
7 / 7 / 0
Регистрация: 19.06.2013
Сообщений: 174
02.06.2014, 18:28  [ТС]     Непонятная логика работы оператора new #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Очень даже прокатит:
Спасибо за ответ!
Подойдет ли функция memcpy заместо strcpy? Интересуюсь, потому что у меня в реальности работа не со строками идет, а с классами, битком набитыми различными типами.
Цитата Сообщение от alsav22 Посмотреть сообщение
А если бы указателями, то sizeof() разное выдал бы?
Поддерживаю вопрос: будут ли размеры указателей int*, float*, char* и т.д. отличаться по размеру от int, float, char соответственно? Вроде как должны одинаковое кол-во памяти занимать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2014, 19:12     Непонятная логика работы оператора new
Еще ссылки по теме:

Логика программы - C++
Всем доброго времени суток! Помогите, пожалуйста, понять логику программы (код дан целиком) по теме связанные списки типа очередь. Код взят...

CTL логика - C++
Подскажите где искать литературу, у меня курсовая на тему : &quot;Написать библиотеку классов функций реализующую CTL логику&quot;. Т.е. необходимо...

C++ мат. логика - C++
НАПИШИТЕ прогу pleas (желательно самый оптимальный вариант): дани число n и а=1, а можно умножать на 2 и на 3. Вопрос: как получить из...

Нечеткая логика - C++
Здравствуйте. Помогите пожалуйста с програмкой.


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 19:12     Непонятная логика работы оператора new #10
Цитата Сообщение от Divergence Посмотреть сообщение
Поддерживаю вопрос
Я такой вопрос не задавал. Размеры указателей, на разные типы, одинковы.

Добавлено через 10 минут
Цитата Сообщение от Divergence Посмотреть сообщение
Подойдет ли функция memcpy заместо strcpy? Интересуюсь, потому что у меня в реальности работа не со строками идет, а с классами, битком набитыми различными типами.
И зачем там memcpy()?
Yandex
Объявления
02.06.2014, 19:12     Непонятная логика работы оператора new
Ответ Создать тему
Опции темы

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