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

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

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

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

02.06.2014, 15:08. Просмотров 291. Ответов 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
Посмотрите здесь:

C++ CTL логика
C++ мат. логика C++
Ищу 2 оператора для работы с файлами C++
Нечеткая логика C++
Логика выражения C++
C++ Логика switch
C++ Реализовать стек и 3 оператора для работы с ним
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5413 / 4809 / 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
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2014, 15:21     Непонятная логика работы оператора new #4
Цитата Сообщение от Divergence Посмотреть сообщение
А как мне добавить строку из букв именно в выделенную, оператором new, память?
Копировать (strcpy()).
dzrkot
zzzZZZ...
518 / 348 / 53
Регистрация: 11.09.2013
Сообщений: 1,994
02.06.2014, 15:23     Непонятная логика работы оператора new #5
Цитата Сообщение от Divergence Посмотреть сообщение
А как мне добавить строку из букв именно в выделенную, оператором new, память?
strcpy не прокатит?)

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Цитата Сообщение от Divergence Посмотреть сообщение
Каким образом можно узнать размер выделенной памяти под переменную?
Никаким.
где-то вроде мне попадалось на глаза что это можно как-то делать, сейчас поищу в книге
alsav22
5413 / 4809 / 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
Модератор
Эксперт С++
1784 / 1159 / 224
Регистрация: 16.05.2013
Сообщений: 3,048
Записей в блоге: 5
Завершенные тесты: 1
02.06.2014, 16:46     Непонятная логика работы оператора new #7
Цитата Сообщение от Divergence Посмотреть сообщение
По какой-то причине, sizeof мне показывает, что и test1 и test2 по размеру равны 4 байтам. Почему???
Потому что они являются переменными типа int, а не указателями!
alsav22
5413 / 4809 / 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++
Неверная логика аппы C++
C++ Перегрузка оператора минус для матриц. Программа зависает в конце своей работы
C++ Логика программы
Переопределение оператора "меньше" пользовательского типа для работы с set C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5413 / 4809 / 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
Ответ Создать тему
Опции темы

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