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

Динамическое выделение памяти под объект - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
03.02.2011, 17:12     Динамическое выделение памяти под объект #1
Здравствуйте, меня интересует несколько вопросов по поводу конструкции new.

Есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct element
    {
        std::string value;
        int pos;
    };
    element* list;
 
    list = new element[20];
 
        /** Что-то еще **/
 
    list = new element[20];
1. Допустимо ли так делать?
2. Переменная list, в итоге, будет хранить указатели на 40 объектов типа element?
3. Тот же самый код, но в заголовочном файле, компилируется с ошибками:

Код
1>\list.h(16): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>\list.h(16): error C2040: list::list: "int" отличается по уровням косвенного обращения от "list::element *"
1>\list.h(16): error C2440: инициализация: невозможно преобразовать "list::element *" в "int"
1>          Не существует контекста, в котором такое преобразование возможно
на 16 строке:
C++
1
list = new element[20];
Никак не пойму как исправить
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
03.02.2011, 17:20     Динамическое выделение памяти под объект #2
Цитата Сообщение от Dejust Посмотреть сообщение
1. Допустимо ли так делать?
Так не нужно делать..
Делай так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Bar{
    //....
    int data;
};
int main()
{
 
    Bar *pBar = new Bar[20];
    //....
    delete[] pBar;
 
    pBar = new Bar[30];
    //...
    delete[] pBar;
 
    ....
Цитата Сообщение от Dejust Посмотреть сообщение
2. Переменная list, в итоге, будет хранить указатели на 40 объектов типа element?
Нет..
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
03.02.2011, 17:27  [ТС]     Динамическое выделение памяти под объект #3
ISergey, спасибо.

Тогда мне бы хотелось узнать, как динамически выделять память под тот же самый массив, не теряя при этом данных, хранящихся в нем?
Или помогите составить поисковый запрос
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
03.02.2011, 17:57     Динамическое выделение памяти под объект #4
Используй std::vector
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
04.02.2011, 16:09  [ТС]     Динамическое выделение памяти под объект #5
Если использовать std::vector, то как-то не интересно получается, мне ведь не для реального проекта это надо, а так, для практики... Хочеться, так сказать, копнуть по глубже.

Какими знаниями надо обладать, чтобы реализовать то, что я описал в посте #3?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.02.2011, 16:53     Динамическое выделение памяти под объект #6
Dejust, в языке C есть функция realloc, которая позволяет выделить дополнительную память (или наборот, урезать ее) для массива (если новый размер массива больше старого, то существующие данные в нем не теряются). В С++, однако, отсутствуют аналогичные средства для работы с памятью, поэтому нужно использовать либо контейнерные типы стандартной библиотеки шаблонов (как посоветовали выше), чья реализация скрывает от пользователя все аспекты выделения-освобождения памяти, либо вручную выделять новый массив большего размера, копировать в него элементы старого и удалять старый:
C++
1
2
3
4
5
6
foo* oldf = new foo [size1];
//... работаем с массивом
foo* newf = new foo [size2]; // size2 > size1
copy(newf, oldf, size1); // Некоторая вспомог. функция для копирования существующих элементов массива
delete[] oldf; // Освобождаем память, на которую указывает oldf
oldf = newf; // Теперь oldf указывает на область памяти большего размера, куда мы скопировали старые элементы
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.02.2011, 17:00     Динамическое выделение памяти под объект #7
Dejust, чтобы увеличить размер динамического массива, то тебе придётся сначала выделить новую память, потом скопировать старый массив в новый, а затем удалить старый массив.

Добавлено через 1 минуту
опоздал...
Dejust
 Аватар для Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 05:44  [ТС]     Динамическое выделение памяти под объект #8
Nameless One, volovzi спасибо большое
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
27.01.2013, 23:49     Динамическое выделение памяти под объект #9
Цитата Сообщение от ISergey Посмотреть сообщение
struct Bar{
* * //....
* * int data;
};
int main()
{
Bar *pBar = new Bar[20];
* * //....
* * delete[] pBar;
Указатель на массив успешно создан, а как пользоваться его элементами?
C++
1
pBar[2]->Bla(); // Так можно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 00:08     Динамическое выделение памяти под объект
Еще ссылки по теме:

Динамическое выделение памяти под массив C++
Динамическое выделение памяти под двумерный массив C++
C++ Динамическое выделение памяти под массив

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

Или воспользуйтесь поиском по форуму:
MickeyBlueEyes
Студент
 Аватар для MickeyBlueEyes
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
28.01.2013, 00:08     Динамическое выделение памяти под объект #10
Цитата Сообщение от vbloodv Посмотреть сообщение
Указатель на массив успешно создан, а как пользоваться его элементами?
C++
1
pBar[2]->Bla(); // Так можно?
Так сработает.
C++
1
2
3
 
 Bar * ptr = &pBar[2];
 ptr -> Bla();
Yandex
Объявления
28.01.2013, 00:08     Динамическое выделение памяти под объект
Ответ Создать тему
Опции темы

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