C ++ динамический массив, увеличение емкости

Я пытаюсь реализовать динамический массив, и вот моя функция для увеличения емкости

int* changeCapacity(int *arr, int length, int newCapacity) {
int *newArr = new int[newCapacity];

if(length > newCapacity){
return 0;
} else {
for(int i = 0; i < length; i++){
newArr[i] = arr[i];
}
delete[] arr;
arr = newArr;
return arr;
}
}

Это ошибка, которую я получаю:

speicher (2465,0x7fff7cfc2310) malloc: * ошибка для объекта 0x7f9742403910: освобожденный указатель не выделен
*
установить точку останова в malloc_error_break для отладки

я называю это так:

int* addElement(int *arr, int& length, int& capacity, int val){
if(length >= capacity){
capacity = capacity * 2;
changeCapacity(arr, length, capacity);

arr[length] = val;
length += 1;
return arr;
}else{

arr[length] = val;
length += 1;
return arr;
}

}

1

Решение

Вот лучший способ сделать это. Все хорошо объясняется в комментариях для тех, кто хочет учиться:

        #include <iostream>
using namespace std;

int* changeCapacity(int *arr, int length, int newCapacity);
int* addElement(int *arr, int& length, int& capacity, int val);

int main(){
int length = 0; // no inital elements in array
int capacity = 1; // initial capacity is one
int* arr = new int[capacity]; // allocating space for values
int* temp; // pointer for storing temporary values
/* loop for adding elements to the array */
for(int i=0;i<21;i++){
temp = addElement(arr,length,capacity,i); // adding an element to the array
if(temp == NULL) { // checks if execution was successful
cout<< "NULL returned...\n Exiting Now...";
return 0; // exits the program on failure
}
arr = temp; // changing the value of arr
}
/* loop for printing the array */
for(int i=0;i<length;i++){
cout<<arr[i]<<" ";
}
return 0;
}
/* function for increasing the capacity of array */
int* changeCapacity(int *arr, int length, int newCapacity) {
int *newArr = new int[newCapacity]; // definging a new array

if(length > newCapacity){ // checking if the length of the array is valid
cout<< "invalid length of array\n";
return NULL;
} else {
/* loop for transferring values to the new array */
for(int i = 0; i < length; i++){
newArr[i] = arr[i];
}
delete[] arr; // deleting the old array (clears the memory of the old array)
// arr = newArr; removed as this is not needed
return newArr; // returns the new array
}
}

/* function for adding a new element to the array */
int* addElement(int *arr, int& length, int& capacity, int val){
if(length >= capacity){ // checks if the array has space for storing the given value or not
capacity = capacity * 2; // doubles the capacity of the array
int* temp = changeCapacity(arr, length, capacity); // changes the size of the array to the new one
if(temp == NULL){ // checking if a null was returned
cout<< "Failed to change capacity\n";
return NULL; // returning  NULL
}
arr = temp; // the value of arr was not changed in your code (problem corrected)
arr[length] = val; // stores the value in the array
length += 1; // increasing the number of element count of the array
return arr; // returns the new array
}else{
arr[length] = val; // stores the value in the array
length += 1; // increasing the number of element count of the array
return arr; // returns the new array
}
}
-1

Другие решения

Я предполагаю, что ваша проблема должна исходить из двух вещей ИМО :

Первый:

changeCapacity(arr, length, capacity);
arr[length] = val;

Здесь вы не получите новый прибытие значение (возвращается changeCapacity ()).
Так твоя функция addElement () вернет неправильный указатель и на ваш следующий addElement () это сделает свободное повреждение памяти.

Почему вы должны получить новое значение arr?

Вы делаете так же, как здесь

a = 1;
changeVar(a);
// value of a here?

int changeVar(int a)
{
a = 5;
return (a);
}

Какова будет ценность ? 1, потому что аргумент changeVar является локальной переменной.

Во-вторых:

Вы даете НОЛЬ ценность на вашем addElement () функция.

1

Прямо сейчас вы меняете адрес arr, в котором вы должны передать указатель по ссылке. Сделай это:

int* changeCapacity(int *&arr, int length, int newCapacity)
0

Это несколько догадка, основанная на сообщении об ошибке, но вы показали:

int* addElement(int *arr, int& length, int& capacity, int val)
{ //...
changeCapacity(arr, length, capacity);
//...
}

который звонит:

int* changeCapacity(int *arr, int length, int newCapacity)
{ //...
delete[] arr;
//...
}

Тем не менее, первоисточник arr аргумент addElement() неизвестно, учитывая код, который вы опубликовали до сих пор. Вы случайно делаете что-то вроде этого:

foo()
{ int array[N];
//...
addElement(array, ...);
//...
}

или, может быть, звоню addElement() с глобальной переменной массива? В любом из этих случаев исходный массив не выделяется через new[] чтобы соответствовать delete[]и, похоже, именно на это жалуется библиотека времени выполнения. Значение указателя, указанное в сообщении об ошибке, заставляет меня думать, что изначально оно было размещено в стеке.

Конечно, другие проблемы, такие как не получение возвращаемого значения changeCapacity() и / или addElement()и вероятность того, что changeCapacity() может вернуть NULL-указатель, все еще действителен, и должен быть исправлен.

0
По вопросам рекламы [email protected]