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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
#1

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

03.02.2011, 17:12. Просмотров 3446. Ответов 9
Метки нет (Все метки)

Здравствуйте, меня интересует несколько вопросов по поводу конструкции 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];
Никак не пойму как исправить
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2011, 17:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое выделение памяти под объект (C++):

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

Как работает динамическое выделение памяти под объект? - C++
class A { public: A(int x){} ~A(){} }; const int n = 50; A* placementMemory = static_cast<A*>(operator new (n *...

Динамическое выделение памяти под строки - C++
Доброго времени суток. Изучаю основы C++, дошел до раздела "указатели и динамическое выделение памяти". Имеется код, в котором...

Динамическое выделение памяти под массив - C++
Я хочу функцию использовать пару раз, количество команд будет уменьшаться, и "n" надо менять. Как написать не знаю. 12 или 13 строка. ...

Динамическое выделение памяти под структуру - C++
#include <iostream> using namespace std; struct person { char*name; char *adres; int age; }; void allocation (person *mas,...

Динамическое выделение памяти под массив - C++
Доброго времени суток. Как реализовать динамическое выделение памяти под массив, к примеру размера n, при том, что значение этого n в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 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
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
03.02.2011, 17:27  [ТС] #3
ISergey, спасибо.

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

Какими знаниями надо обладать, чтобы реализовать то, что я описал в посте #3?
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
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
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.02.2011, 17:00 #7
Dejust, чтобы увеличить размер динамического массива, то тебе придётся сначала выделить новую память, потом скопировать старый массив в новый, а затем удалить старый массив.

Добавлено через 1 минуту
опоздал...
Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
05.02.2011, 05:44  [ТС] #8
Nameless One, volovzi спасибо большое
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(); // Так можно?
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();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 00:08
Привет! Вот еще темы с ответами:

Динамическое выделение памяти под двумерный массив - C++
Нужно написать программу, динамически выделяем память под двумерный массив, функции ввода-вывода, функцию, которая будет складывать 2...

Динамическое выделение памяти под структуру (malloc) - C++
Нашел данное решение на этом форуме, но никак не могу понять как оно работает. Вот даны структуры: struct info // структура...

Динамическое выделение памяти под двумерный массив - C++
Здравствуйте. Как мне правильно и грамотно (!) выделять память под двумерные массивы? Откуда возникла необходимость — хотел сделать...

Динамическое выделение памяти под массив int - C++
плиз хелп Написать функцию getPrimes, которая принимает массив типа int и его размер. Функция должна вернуть указатель на новый...


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

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

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