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

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

Войти
Регистрация
Восстановить пароль
 
 
alexsanqp
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 37
#1

Растолкуйте new с адресацией! - C++

30.01.2014, 16:30. Просмотров 849. Ответов 20
Метки нет (Все метки)

Я так понимаю что это для избегания повторного выделения памяти? но до конца так и не понял. Спасибо откликнувшимся.
Вот я экспериментировал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
char buffer[500];
 
void main()
{
        int *a, *b, *c;
 
        a = new (buffer) int[120];
        b = new (buffer) int[200];
        с = new int[8];
 
    a[2] = 220;
    b[3] = 330;
    c[4] = 440;
 
    cout << a[2] << "   " << &a[2] << endl;
    cout << b[3] << "   " << &b[3] << endl;
        cout << c[4] << "   " << &c[4] << endl;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2014, 16:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Растолкуйте new с адресацией! (C++):

New с адресацией - C++
Объясните пожалуйста, почему массив buffer не инициализируется нигде, а память все равно выделяется. Т.е. какое-то значение buffer -у...

Растолкуйте код - C++
Помогите с кодом cout &lt;&lt; (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? '#' : a) &lt;&lt; (j &lt;= M ? &quot;&quot; : &quot;\n&quot;); что делает cout &lt;&lt; ( ? : ); я...

Растолкуйте почему выводится единица - C++
Почему выводит 1?? #include int main(int argc, char** argv) { int x = 0; int y = 0; if (x++ &amp;&amp; y++) ...

растолкуйте про хэш плиз - C++
на картинке реализация поиска в &quot;hash_map&quot; от Страуструпа. И все бы хорошо если бы не один момент. b и v это векторы. И доступ по индексу...

Case в switch и вообще растолкуйте за код - C++
Объясните пожалуйста что имеет в виду Стаус 1)case'(':case')': 2) curr_tok=Token_Value(ch) это приведение к Token_Value? 3)чем по...

Растолкуйте строчку из вики о фабричном методе - C++
Слово &quot;специфицировались&quot; никак понять не могу. Также, не могу понять как это так, чтоб на создаваемые классом объекты влияли...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
30.01.2014, 17:32 #2
Первый раз такое встречаю,
но при трассировке увидел, что
массивы a,b и buffer начинаются с одного и того же места.
Получается, что в такой конструкции
C++
1
a=new(buffer) int[120];
buffer - это адрес, начиная с которого надо выделить память.
1
Croessmah
Эксперт CЭксперт С++
13213 / 7484 / 843
Регистрация: 27.09.2012
Сообщений: 18,394
Записей в блоге: 3
Завершенные тесты: 1
30.01.2014, 18:03 #3
placement new размещает объект в указанном куске памяти
Цитата Сообщение от alexsanqp Посмотреть сообщение
но до конца так и не понял.
что остается не понятным?
1
alexsanqp
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 37
30.01.2014, 19:05  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
что остается не понятным?
ну к примеру, если в указателе "а" число элементов массива превышает число "buffer". Допустим
C++
1
2
3
4
5
6
7
8
9
//...
char buffer[20];
 
void main() {
 int *a;
 
 a = new (buffer) int[50];
 
}
Все выводится без ошибок. И правильно ли считается, к примеру что бы 3 указателя ссылались на "buffer" ?
0
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 19:20 #5
Цитата Сообщение от alexsanqp Посмотреть сообщение
Все выводится без ошибок.
А ты выдели памяти побольше и запиши что-нибудь под потолок, увидишь.
buffer - это не динамическая память, к слову.
1
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
30.01.2014, 19:24 #6
alexsanqp, buffer указывает на участок памяти и не несет никакой информации о том, сколько там памяти было выделено ранее. То есть, всё так и должно отработать без ошибок.
1
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
30.01.2014, 19:32 #7
Цитата Сообщение от alexsanqp Посмотреть сообщение
правильно ли считается, к примеру что бы 3 указателя ссылались на "buffer" ?
не правильно, массив a и b разделяют одну область памяти, начало массива b на сдвинуть на размер массива a (еще надо учитывать выравнивание) - то есть
C++
1
b = new (buffer + 120) int[200];
1
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 19:35 #8
Цитата Сообщение от zelim Посмотреть сообщение
alexsanqp, buffer указывает на участок памяти и не несет никакой информации о том, сколько там памяти было выделено ранее. То есть, всё так и должно отработать без ошибок.
Даже, если бы нес, ошибок бы не было.

Добавлено через 2 минуты
Цитата Сообщение от Кудаив Посмотреть сообщение
не правильно, массив a и b разделяют одну область памяти, начало массива b на сдвинуть на размер массива a (еще надо учитывать выравнивание) - то есть
Код C++
1
b = new (buffer + 120) int[200];
И бага никуда не денется.
0
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
30.01.2014, 19:43 #9
Цитата Сообщение от alexsanqp Посмотреть сообщение
Все выводится без ошибок
так как память при применении placement new выделяется функцией имеющую такую простую реализацию
C++
1
2
3
4
void* operator new(size_t size, void* ptr)
{
     return ptr; // память для размещения уже есть выделять ничего не нужно
}
Цитата Сообщение от alexsanqp Посмотреть сообщение
ну к примеру, если в указателе "а" число элементов
массива превышает число "buffer"
то будет непонятно что, что называется undefined behavior - мы можем писать в память принадлежащую буферу - в рантайме при записи вне буфера практически гарантированно сигаборт

Добавлено через 45 секунд
Vourhey, о какой баге речь?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
30.01.2014, 19:44 #10
Placement new предназначен для создания объекта с помощью конструктора, даже если память под объект уже выделена. Вся суть в вызове конструктора! Создавать инты с помощью placement new бессмысленно!
1
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 19:52 #11
Цитата Сообщение от Кудаив Посмотреть сообщение
Добавлено через 45 секунд
Vourhey, о какой баге речь?
Об этой
Цитата Сообщение от Кудаив Посмотреть сообщение
в рантайме при записи вне буфера практически гарантированно сигаборт
1
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,168
Завершенные тесты: 2
30.01.2014, 19:55 #12
Vourhey, так это не бага - это особенности работы C++ с памятью, не использовать использовать с осторожностью
1
ValeryS
Модератор
6631 / 5039 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
30.01.2014, 20:04 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ

Не по теме:

я бы так сказал под одним словом new скрывается много сущностный
одну из них объяснил Croessmah,
еще много будет таких вопросов, чем больше будешь погружаться в эту рутину под названием С с плюсами
а равно и без них
может я скажу глупость(тоном менотора) рассуждать о плюсах и минусах этого языка
может тот кто научился думать на уровне процессора.
Не зря его называют "высокоуровневый ассемблер"
всеми тонкостями могут пользоваться только тот кто прошел весь путь, и это не дискриминация
ребенку не дают в руки опасную бритву
так же и Си грамотное владение им позволяет сделать эффективные программы, не грамотное приведет к краху, и ладно бы сейчасможет через много лет, поменялся процессор, система......
Еще раз повторю "высокоуровневый ассемблер" нужно мыслить как процессор
это в отличии от Виртовского паскаля хоть и K&R заявляли что это кросплатформенный язык
этого не произошло под каждую платформу есть свой диалект языка
посему не удивляйся а учи язык



Добавлено через 5 минут
Цитата Сообщение от alexsanqp Посмотреть сообщение
ну к примеру, если в указателе "а" число элементов массива превышает число "buffer".
И что адрес не изменился
к примеру
есть указатель он указывает на улицу Крауля д.1( извините за местечковость) и один массив говорит пойди до дома 3
другой до дома 5
а третий вообще до дома 1000, и наплевать, что дома такого нет
в любом случае оператор говорит отсчитывай от дома номер 1
3
alexsanqp
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 37
30.01.2014, 20:25  [ТС] #14
Спасибо всем, за ясные ответы.
0
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 21:45 #15
Цитата Сообщение от Кудаив Посмотреть сообщение
так это не бага - это особенности работы C++ с памятью
Это именно бага - сдвигать указатель на невыделенную область памяти и осуществлять там операции. Если ты считаешь, что это правильно, то проблемы у автора в коде нет вообще и сдвигать ничего не нужно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2014, 21:45
Привет! Вот еще темы с ответами:

Что такое Хэш таблица с открытой адресацией - C++
Здраствуйте у меня такой вопрос то такое Хэш таблица с открытой адресацией хеш функция что должно храниться в структуре как осуществляется...

Удаление узла бинарного дерева, проблема с функциями, адресацией - C++
код: #include &lt;cstdlib&gt; #include &lt;iostream&gt; typedef struct tree{ // обьявляем тип char data; //дата изьятия в формате xx.xx.xxxx ...

На Дваче анон поднял хитрый пример на тему ++i, растолкуйте мне, гики, а то я так ничего и не понял - C++
Цитирую...

Проблема с адресацией - Assembler
Точнее сказать проблема с моей головой, которая что-то не понимает..Мне нужно вывести надпись в установленном месте в функции, аргументом...


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

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

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