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

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

Войти
Регистрация
Восстановить пароль
 
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
#1

Как увеличить размер дин. массива средствами С++ - C++

19.04.2011, 22:22. Просмотров 928. Ответов 1
Метки нет (Все метки)

Привет всем!!!
Подскажите плз, как увеличить размер (т.е добавить один элемент в конец) динамического массива средствами С++. (new и delete)

Пример:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <process.h>
#include <new.h>
 
using std::cout;
 
class Sample
{
public:
    Sample(int _a = 0) : a(_a) {}
    ~Sample() {}
private:
    int a;
    friend std::ostream &operator<< (std::ostream &stream, Sample &obj);
};
 
std::ostream &operator<< (std::ostream &stream, Sample &obj)
{
    stream << obj.a;
    return stream;
}
 
 
int main()
{
    int  n = 2;
    Sample *p = new Sample[n];
    p[0] = Sample(1);
    p[1] = Sample(2);
 
    for (int i = 0; i < n ; i++)
        cout << p[i] << '\n';
 
    ++n;
 
    //realloc(p, n*sizeof(Sample));   // вызывает ошибкупосле запуска на стадии работы (проблемы с кучей)
 
    // вместо realloc придумал следующее шаманство 
    Sample *temp = new Sample[n];
    for (int i = 0; i < n-1 ; i++)
        temp[i] = p[i];
 
    temp[n-1] = Sample(3);
    delete [] p;
 
    p = temp;
    /////////////////////////////////////////////////////////////
 
    for (int i = 0; i < n ; i++)
        cout << p[i] << '\n';
    
    delete [] p;
    system("pause");
 
}
Это можно решить с помощью malloc() и free() и realloc() заработает, но я так не хочу.

По поводу моей придумки с выделением еще одного блока памяти на единицу большего размера, думаю так не покатит, ибо если первый массив состоит из нескольких Гб то никто не будет выделять еще столько же памяти для добавления одного элемента в массив.

Посоветуйте стонибуть
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2011, 22:22     Как увеличить размер дин. массива средствами С++
Посмотрите здесь:

C++ Как увеличить размер консольного окна
C++ Непонятная ошибка при инициализации дин. массива
Увеличить указатель на размер адресуемой структуры C++
Крашится программа при попытке присваивания значения элементу дин-го массива C++
C++ Добавление и удаление элементов дин массива
Как увеличить размер стека? C++
C++ Увеличить указатель на размер адресуемой им структуры
C++ Как увеличить размерность массива?
Как увеличить размер программы? C++
Создание дин массива для структуры C++
Увеличить размер выводимого текста (увеличить буквы) функции outtextxy C++
C++ Передача дин массива без сохранения изменений

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.04.2011, 22:39     Как увеличить размер дин. массива средствами С++ #2
Только копированием и переназначением указателей. Пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void my_realloc(int *&old_arr, size_t old_size)
{
    int *new_arr = new int [old_size + 1];
 
    for (size_t i = 0; i < old_size; ++i)
        new_arr[i] = old_arr[i];
 
    new_arr[old_size] = 0;
 
    delete [] old_arr;
 
    old_arr = new_arr;
}
Добавлено через 1 минуту
А вообще обычная практика: при каждой необходимости перевыделить память выделяется не на один (2, 3 или сколько там актуально на данный момент) элемент больше, а в два раза больше памяти, чем при предыдущем выделении.
Yandex
Объявления
19.04.2011, 22:39     Как увеличить размер дин. массива средствами С++
Ответ Создать тему
Опции темы

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