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

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

Войти
Регистрация
Восстановить пароль
 
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
#1

Операция new с размещением - C++

08.10.2013, 11:19. Просмотров 874. Ответов 6
Метки нет (Все метки)

проблема:Во второй элемент структуры данные не передаются, почему? Стоит отметить, что, если использовать просто new без размещения, то все отлично работает. Сравнивал с решение из решебника - вроде все верно...

Код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <new>
#include <cstring>
 
using namespace std;
const int BUF=1024;
char buffer[BUF];
 
 
struct chaff
{
    char dross[20];
    int slag;
};
 
void setstruct(chaff &,const char *, int);
void showstruct(const chaff &);
 
 
int main()
{
    chaff * pt1=new (buffer) chaff[2];
    setstruct(pt1[0], "Google", 12);
    setstruct(pt1[1], "Yandex", 6);
    for(int i=0; i<2; i++, pt1++)
        showstruct(pt1[i]);
 
    return 0;
}
void setstruct(chaff & pt, const char * dr, int sl)
{
    strcpy(pt.dross, dr);
    pt.slag=sl;
}
void showstruct(const chaff & pt)
{
    cout<<"Dross: "<<pt.dross<<endl;
    cout<<"Slag: "<<pt.slag<<endl<<endl;
}


PS^ Так же, большая просьба объяснить где и как применяется new с размещением, насколько я понял из учебника - эта операция только добавляет головняка, а какой от нее profit?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2013, 11:19     Операция new с размещением
Посмотрите здесь:

Объясните значение операций: дополнение ~lvalue, унарный плюс и минус, операция создания с размещением - C++
Что такое дополнение ~lvalue, унарный плюс и минус и операция создания с размещением, или создания с размещением и инициализацией new...

new с размещением и двумерный массив - C++
Подскажите, как с помощью new с размещением создать двумерный массив? С одномерным мне все понятно #include &lt;new&gt; char...

Как работает "new с размещением" - C++
Всем доброго времени суток. Уважаемые знатоки, объясните пожалуйста, как работает &quot;new с размещением&quot;? Сейчас занимаюсь по книге С. Прата,...

операция <<::>> - C++
имею код char Car::*Get_Marka(){ return marka ; } char Car::*Get_Color() { return color ; } bool Car::Get_Rastamojena() { return...

операция присваивания - C++
Столкнулся с глупой проблемой, может кто объяснить, как в таком случае делается присваивание и в чем у меня ошибка? int a=1, b=2, c=3,...

операция повторения - C++
#include &lt;iostream&gt; using namespace std; int main() { int match, win, ni, por; cout&lt;&lt;&quot;Введите количество матчей: &quot;; ...

Битовая операция -> - C++
Что делает операция -&gt; К примеру, есть структура: struct BIT{ unsigned int cod1:3; :1;...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1788 / 1163 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
08.10.2013, 11:44     Операция new с размещением #2
Делаем так:
C++
1
    for(int i=0; i<2; i++)
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
08.10.2013, 12:05  [ТС]     Операция new с размещением #3
Ilot, а в чем принципиальная разница? По Вашему индекс будет циклом выставляться, а я его просто ручками поставил...
Объясните пожалуйста.
Jupiter
Каратель
Эксперт С++
6551 / 3971 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.10.2013, 12:11     Операция new с размещением #4
Цитата Сообщение от h_wolf Посмотреть сообщение
for(int i=0; i<2; i++, pt1++)
лишнее

Цитата Сообщение от h_wolf Посмотреть сообщение
где и как применяется new с размещением
в std::allocator

Цитата Сообщение от h_wolf Посмотреть сообщение
а какой от нее profit?
профит в том что новая память для объекта не выделяется, а объект конструируется в указанном месте

Добавлено через 2 минуты
Цитата Сообщение от h_wolf Посмотреть сообщение
for(int i=0; i<2; i++, pt1++)
* * * * showstruct(pt1[i]);
Цитата Сообщение от h_wolf Посмотреть сообщение
а в чем принципиальная разница? По Вашему индекс будет циклом выставляться, а я его просто ручками поставил...
Объясните пожалуйста.
ptr после инициализации указывал на начало массива, операция обращения по индексу задает смещение от начала массива, на каждой итерации ты увеличивешь индекс и меняешь начало, вот и получается выход за границу массива
Ilot
Модератор
Эксперт С++
1788 / 1163 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
08.10.2013, 12:18     Операция new с размещением #5
Как правильно написал Jupiter ты сместил указатель
C++
1
pt1++
и теперь он указывает на второй элемент. И вот тут ты используешь команду:
C++
1
pt1[i]
Которая по сути означает то же самое, что и pt1 + 1. А так как указатель уже сместился на второй элемент такой вызов приведет к обращению к 3 элементу(т.е. выход за пределы массива), а не второму как тебе кажется.
p.s. Вот вам пожайлуста наглядное отличие указателя на массив и константное имя масива. С последним подобной ошибки не случится.
h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 212
08.10.2013, 12:20  [ТС]     Операция new с размещением #6
Ilot, Jupiter, да, проглядел, спасибо большое.

Добавлено через 33 секунды
Jupiter, можете более подробно рассказать как это происходит?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2013, 12:38     Операция new с размещением
Еще ссылки по теме:

побитовая операция - C++
Вычислить, объяснить результат выражения, используя поразрядные операции, для заданных значений целых переменных a, b, c. a+b*c a = 1,...

Операция постинкремента - C++
Как правильно реализовать операцию постинкремента, или же в данном коде всё верно? Меня смущает тот факт, что функция сохраняет...

операция switch - C++
switch(c)//char c=f.get() { case ' ': ne=true; break; case '\t': ne=true; break; break; case '\n': ne=true; case EOF:

Операция присваивания - C++
Чем отличается операция присваивания &quot;/=&quot; от &quot;=&quot; ?

Операция ИЛИ - C++
Добрый вечер) Я новичок в СИ поэтому если вопрос глупый не пинайте) Возможно ли сделать подобную операцию в СИ: IF (a == 3 ИЛИ 4) {...


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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6551 / 3971 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.10.2013, 12:38     Операция new с размещением #7
Цитата Сообщение от h_wolf Посмотреть сообщение
можете более подробно рассказать как это происходит?
C++
1
2
3
4
5
{
    myclass obj;
}
myclass* ptr = new myclass();
myclass* pt1=new (buffer) myclass();
во всех трех случаях вызывается конструктор объекта.
в 1-м случае компилятор сместил указатель на верхушку стека тем самым выделив память для объекта на стеке и в ней разместили объект (читай вызвали конструктор).
во 2-м случае запросили память под объект в куче и в ней разместили объект.
в 3-м случае разместили объект в той памяти, которую ты указал.
Yandex
Объявления
08.10.2013, 12:38     Операция new с размещением
Ответ Создать тему
Опции темы

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