2016-02-14 2 views
-1

аннулируются расширения()C++ создан класс Vector

Эта функция позволит удвоить емкость вектора. Эта функция должна перераспределять память для динамически распределенного массива и обновлять значение емкости. Будьте осторожны, чтобы правильно обрабатывать случай, когда емкость равна 0, перед вызовом функции expand().

Убедитесь, что вы не создаете утечку памяти здесь.

недействительными расширения (без знака) количество

Эта функция будет расширить емкость вектора на величину принятого в. Эта функция должна перераспределить память для динамически выделенного массива и обновить значение емкости.

Убедитесь, что вы не создаете утечку памяти здесь.

Я пытаюсь ответить на эти функции, но я просто не могу заставить его работать. Это код, который у меня есть до сих пор.

void IntVector::expand() { 
    cap = cap * 2; 
    int *temp = new int[cap]; 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
} 

void IntVector::expand(unsigned amount) { 
    cap = cap + amount; 
    int *temp = new int[cap]; 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
} 

У меня также есть частные поля данных:

-unsigned SZ: сохраняет размер IntVector (число элементов используется в настоящее время).

-unsigned крышка: хранить размер массива

-INT * данные: хранит адрес динамически выделяемой массив целых чисел

Я не могу показаться, чтобы выяснить проблему.

Большое вам спасибо.

+0

Пожалуйста, пост Minimal, полный, Верифицируемый пример.В его нынешнем виде ваш вопрос не по теме. –

ответ

0

add data = temp; после удаления [] данных; на самом деле вам нужно сделать больше, чтобы позаботиться о сбое для выделения памяти.

+0

что еще мне нужно сделать? – Trey

0

Вы забыли назначить выделенные temp на data.

И вы должны проверить, является ли amount равным 0, и нет необходимости реализовывать ту же логику в двух функциях.

void IntVector::expand() { 
    expand(cap); 
    ~~~~~~~~~~~~ 
} 

void IntVector::expand(unsigned amount) { 
    if (amount <= 0) return; 
    ~~~~~~~~~~~~~~~~~~~~~~~~ 
    int *temp = new int[cap + amount]; 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    cap = cap + amount; 
    delete [] data; 
    data = temp; 
    ~~~~~~~~~~~~ 
} 
+0

- это единственное, что мне не хватает? – Trey

+0

@Trey См. Мой отредактированный ответ, пожалуйста. – songyuanyao

0

Есть два вопроса:

  1. Неудачные назначить data члена из temp:
  2. Изменение переменных-членов, таких как cap, прежде чем вы уверены, что вы можете выделить память успешно.

Для пункта 2) выше, если new[] бросает исключение, вы развратили cap элемент, изменяя его.

Вот поправки:

void IntVector::expand() { 
    int *temp = new int[cap * 2]; 
    cap *= 2; // <-- Set this after you've allocated 
    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
    data = temp; // <--- Failed to do this 
} 

void IntVector::expand(unsigned amount) { 
    int *temp = new int[cap + amount]; 
    cap += amount; // <-- Set this after you've allocated 

    for(unsigned i = 0; i < sz; ++i) { 
     temp[i] = data[i]; 
    } 
    delete [] data; 
    data = temp; // <--- Failed to do this 
} 
Смежные вопросы