Ошибка выделения динамической памяти - PullRequest
0 голосов
/ 12 июня 2018

Программа, приведенная ниже, была создана для использования динамически выделяемой памяти ....

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

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

Итак, нет ли способа увеличить размер динамически распределяемого массива, так как здесь моя программа-пример требует большего размера после выделения памяти

#include<iostream>
using namespace std;
int main()
{
    int n;  char ch='y';
    cout<<"Enter size of array: ";
    cin>>n;
    int *arr = new int[n];
    cout<<"Enter elements: ";
    for(int i=0;i<n;++i) cin>>arr[i];

    // above code works fine, the below creates problem

    while(ch=='y')
    {   n++;  cout<<"Enter 1 more element: ";   cin>>arr[n];
        cout<<"Want to enter more? ";       cin>>ch;
    }
    cout<<"All elements are: "; 
    for(int i=0;i<n;++i)
    cout<<arr[i]<<"  ";

    delete []arr;
    return 0;
}

Это то, что показывает valgrind

==5782== Memcheck, a memory error detector
==5782== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==5782== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==5782== Command: ./ec
==5782== 
Enter size of array: 2
Enter elements: 
1
2
Enter 1 more element: 3
==5782== Invalid write of size 4 
==5782==    at 0x4F3A890: std::istream::operator>>(int&) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
==5782==    by 0x108BC7: main (in /home/user1/ec)
==5782==  Address 0x5b8350c is 4 bytes after a block of size 8 alloc'd
==5782==    at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5782==    by 0x108B2A: main (in /home/user1/ec)
==5782== 
Want to enter more? y
Enter 1 more element: 4
Want to enter more? 

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

1 Ответ

0 голосов
/ 13 июня 2018

Проблема в том, что n продолжает расти, а ваш массив - нет.

Этот код вызывает неопределенное поведение, которое, к счастью, вызвало для вас segfault:

while(ch=='y')
{   n++;  cout<<"Enter 1 more element: ";   cin>>arr[n];
    cout<<"Want to enter more? ";       cin>>ch;
}

arr был выделен только для хранения n элементов.Простая запись после конца не будет автоматически перераспределяться.Вы ищете std::vector, который дополнительно избавит вас от необходимости явно распределять / освобождать что-либо.

Вы можете выполнить то, что вы хотите, так (не проверено):

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n;  char ch='y';
    cout<<"Enter size of array: ";
    cin>>n;
    std::vector<int> arr(n);
    cout<<"Enter elements: ";
    for(int i=0;i<n;++i) cin>>arr[i];

    //...

    while(ch=='y')
    {   n++;  cout<<"Enter 1 more element: ";
        int tmp;
        cin>>tmp;
        arr.emplace_back(tmp)
        cout<<"Want to enter more? ";       cin>>ch;
    }
    cout<<"All elements are: "; 
    for(int element : arr)
       cout<< element <<"  ";

    return 0;
}
  • Мы инициализируем вектор для хранения n элементов
    • , что позволяет нам сказать cin >> arr[i] в начале
  • Мыиспользуйте emplace_back для каждого дополнительного элемента
    • , это приведет к тому, что вектор автоматически выделит достаточно новой памяти для нас
    • , и выделение будет происходить логарифмически, поэтому нам обычно не нужно беспокоиться о производительностипотери
...