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

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

Восстановить пароль Регистрация
 
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
08.10.2013, 11:19     Операция new с размещением #1
проблема:Во второй элемент структуры данные не передаются, почему? Стоит отметить, что, если использовать просто 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 с размещением
Посмотрите здесь:

Условная операция C++
C++ операция <<::>>
Операция с Матрицей C++
C++ побитовая операция |
побитовая операция C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
08.10.2013, 11:44     Операция new с размещением #2
Делаем так:
C++
1
    for(int i=0; i<2; i++)
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
08.10.2013, 12:05  [ТС]     Операция new с размещением #3
Ilot, а в чем принципиальная разница? По Вашему индекс будет циклом выставляться, а я его просто ручками поставил...
Объясните пожалуйста.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
08.10.2013, 12:18     Операция new с размещением #5
Как правильно написал Jupiter ты сместил указатель
C++
1
pt1++
и теперь он указывает на второй элемент. И вот тут ты используешь команду:
C++
1
pt1[i]
Которая по сути означает то же самое, что и pt1 + 1. А так как указатель уже сместился на второй элемент такой вызов приведет к обращению к 3 элементу(т.е. выход за пределы массива), а не второму как тебе кажется.
p.s. Вот вам пожайлуста наглядное отличие указателя на массив и константное имя масива. С последним подобной ошибки не случится.
h_wolf
 Аватар для h_wolf
9 / 9 / 1
Регистрация: 24.01.2013
Сообщений: 211
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 с размещением
Еще ссылки по теме:

new с размещением и двумерный массив C++
операция присваивания C++
C++ Как работает "new с размещением"

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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 с размещением
Ответ Создать тему
Опции темы

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