2015-04-21 3 views
0

Я сейчас участвую в C++ и в настоящее время изучаю динамическое распределение памяти. Вот код, который я в настоящее время работает с:Динамическое выделение памяти - C++

#include <iostream> 

using namespace std; 

int *memAdd(int* dyn_Point, int *lenPoint){ 
    int *new_Dyn_Point = new int[*lenPoint * 2]; 
    *lenPoint = *lenPoint * 2; 
    for(int i = 0; i < *lenPoint; i++){ 
     new_Dyn_Point[i] = dyn_Point[i]; 
    } 

    delete lenPoint; 
    delete[] dyn_Point; 
    return new_Dyn_Point; 

} 

int main(){ 

    int len = 2; 
    int *lenPoint = &len; 
    int current = 0; 
    int val; 
    int *dyn_Point = new int[len]; 


    cout << "Input a value for point 1: "; 
    cin >> val; 
    dyn_Point[current] = val; 


    while(val > 0){ 
     current++; 

     cout << "Input a value for point " << current+1 <<" (0 to exit): "; 
     cin >> val; 

     if(current+1 == len){ 
     *dyn_Point = *memAdd(dyn_Point, lenPoint); 
     cout << len; 
     } 

     dyn_Point[current] = val; 


    } 

    for(int i = 0; i < len; i++){ 
    cout << &dyn_Point[i] << "\n"; 
    cout << dyn_Point[i] << "\n\n"; 

} 
delete[] dyn_Point; 

}

Мой вопрос: При добавлении дополнительной памяти это должно увеличиваться на определенное значение?

Всякий раз, когда я начинаю со значения в моей переменной «len», которая не является 2, моя программа будет разбиваться, как только я попытаюсь выделить больше памяти или после выделения большего количества памяти, и еще больше нужно добавить второй раз ,

Это так, как это должно быть, или я чего-то не хватает здесь?

+0

Этот вопрос может быть в: while (val> 0) { current ++; Это первое ++ дает вам 1 для текущего, тогда вы переходите к текущему + 1 в чеке в if-statement, чтобы добавить память, так что только если len == 2 вы добавляете память. –

+0

Вы копируете в два раза больше данных, чем должны. Это может привести к сбою. –

+1

Также 'delete lenPoint' ошибочно, поскольку он не указывает на динамический объект. –

ответ

0

Ваш цикл в то время как нужно требовался break

while() { 

    //do your steps 
    break; 
} 

В функции memAdd следующие изменения:

// *lenPoint = *lenPoint * 2; 

// выше линии потребности в пояснениях иначе это будет беспокоить условие цикла, вызывая над потоком :

for(int i = 0; i < (*lenPoint-1); i++){ 

// for loop is corr ected разрешить обтекание

Ниже удалить ненужно, так как вы не выделять память с помощью этой переменной

// delete lenPoint; 

Для вашего вопроса: При добавлении дополнительной памяти это должно увеличиваться на определенное значение?

В этом отношении нет жесткого и жесткого правила. std :: vector <> удваивает его размер (распределение памяти) всякий раз, когда требуется больше памяти. Это немного отличается от вашего подхода. Вы удваиваете память до достижения выделенного верхнего предела.

**Edit** 

Составитель полный код, как запросить OPs

#include <iostream> 

using namespace std; 

int *memAdd(int* dyn_Point, int *lenPoint){ 
    int *new_Dyn_Point = new int[*lenPoint * 2]; 
    // *lenPoint = *lenPoint * 2; 
    for(int i = 0; i < (*lenPoint-1); i++){ 
     new_Dyn_Point[i] = dyn_Point[i]; 
    } 

    //delete lenPoint; 
    delete[] dyn_Point; 
    return new_Dyn_Point; 

} 

int main(){ 

    int len = 2; 
    int *lenPoint = &len; 
    int current = 0; 
    int val; 
    int *dyn_Point = new int[len]; 


    cout << "Input a value for point 1: "; 
    cin >> val; 
    dyn_Point[current] = val; 


    while(val > 0){ 
     current++; 

     cout << "Input a value for point " << current+1 <<" (0 to exit): "; 
     cin >> val; 

     if(current+1 == len){ 
     *dyn_Point = *memAdd(dyn_Point, lenPoint); 
     cout << len<<"\n"; 
     } 

     dyn_Point[current] = val; 
    break; 

    } 

    for(int i = 0; i < len; i++){ 
    cout << dyn_Point[i] << "\n"; 
    cout << &dyn_Point[i] << "\n\n"; 

} 
delete[] dyn_Point; 

} 
+0

Помещение 'break;' в мой цикл while просто закончит его после первой итерации, не так ли? На самом деле это не помогло бы мне. Комментирование '* lenPoint = * lenPoint * 2; 'помешало бы мне иметь переменную для использования, чтобы контролировать, как долго запускать определенные циклы, поскольку' for (int i = 0; i <1; i ++) 'будет печатать только значение' dyn_Point [0] ' то цикл закончится. – FutureWizard

+0

@FutureWizard вы можете решить условие разбить цикл while, иначе он закончится как бесконечный цикл. Вы должны прокомментировать эту строку * lenPoint = * lenPoint * 2; но я скорректировал условие цикла для ответа вместо жесткого кодирования. Эта переменная доступна, даже если мы прокомментируем эту строку. цикл должен заканчиваться после печати первой переменной, потому что есть только одно значение, вставленное до сих пор в выделенную память. – Steephen

+0

Вы пробовали компилировать этот код самостоятельно? Он по-прежнему не работает, как и ожидалось, потому что без '* lenPoint = * lenPoint * 2;' тогда 'len' никогда не устанавливается ни на что большее, чем на 2 make' for (int i = 0; i <(* lenPoint-1); точно так же, как 'for (int i = 0; i <1;' Также нет необходимости устанавливать условие break, потому что цикл выходит на пользователя, набрав 0. – FutureWizard

0

«Мой вопрос: При добавлении дополнительной памяти это должно увеличиваться на определенное значение»

Конечно, вам нужно управлять распределением памяти, используя такой дизайн.

В частности, вы должны подчиняться Rule of Three (Five) и копировать все существующие элементы при перераспределении памяти до необходимой суммы.


Намного лучший выбор, чем делать все это самостоятельно (что, вероятно, будет подвержен ошибкам), является использование

std::vector<int> dyn_point; 

и/или так в своем классе.

Управление памятью позаботится в container implementations, и вам не нужно беспокоиться об этом.

+0

Большое спасибо за объяснение, книга I «Учиться от этого не получается, используя« вектор »для других ~ 50 страниц, поэтому я пытался решить свою проблему без него. – FutureWizard

+0

@FutureWizard Есть несколько хороших ссылок и примеров, которые вы можете изучить по той ссылке, которую я дал к справочнику [_standard C++ container library_] (http://en.cppreference.com/w/cpp/container). Жаль, что многие текстовые книги, сценарии курсов и учебные пособия пытаются научить распределение памяти вручную на 1-м месте. На практике у вас не должно быть случаев использовать это, и это серьезно относится к расширенному использованию языка, а не для начинающих. –

+1

Чтобы быть справедливым, учебник не заходит слишком далеко в ручную выделение памяти. Я думаю, что важно дать новичкам, таким как я, идея о том, как что-то работает, прежде чем научить их более легкому автоматизированному способу его выполнения. Тем не менее, определенно, используя вектор с этого момента. – FutureWizard

Смежные вопросы