Как очистить динамически выделенную память с помощью оператора delete []?(Невозможно очистить с обычным синтаксисом удаления) - PullRequest
1 голос
/ 31 марта 2019

Я выделил динамическую память, используя int * p = new int [size]; Теперь, когда я пытаюсь удалить его, используя delete [] p; Я получаю ошибку сегментации (дамп ядра) при выполнении кода.

Изначально я мог вводить элементы массива динамически, и он работал нормально. Но, после выполнения определенного количества раз, теперь он говорит ошибка сегментации. У меня есть функция, в которой я выделил память, используя new позже в конце области действия этой функции, которую я включил delete [] p. Я должен включить удаление в основную функцию?

#include<iostream>
using namespace std;

void input(){
    int n,d, i= 0, count;
    cout<< "number of variables: "<<" ";
    cin>>n;
    cout<<"enter number of minterms: "<<" ";
    cin>>count;
    int x =  pow(2, n);

    int *p = new int[count] ; //dynamic allocation

    for(i = 0; i<count; i++)
    {   
        cout<< "enter the minterms in decimal: ";
        cin>>d;    
        p[i] = d;
    }

    for( i =0; i< count; i++){
        cout<<p[i]<<" ";
    }

    delete [] p; //(Do I need  to write delete over here or in the main                           
    //func, Right now I've used it here(i.e,the user defined function.)
    cout<<"successfully deallocated";
}

//Main function:
int main(){

    int *p = NULL; //Is this required ?


    input();
    //delete[] p; (Do I need to mention delete over here?)
    return 0;
}

number of variables:  4
enter number of minterms:  8
enter the minterms in decimal: 1
enter the minterms in decimal: 2
enter the minterms in decimal: 3
enter the minterms in decimal: 4
enter the minterms in decimal: 5
enter the minterms in decimal: 6
enter the minterms in decimal: 7
enter the minterms in decimal: 8
1 2 3 4 5 6 7 8 successfully deallocated00000000119614428832765154679997521907-10100852163265911961440643276540008000800080004000-1005...<a lot of numbers>...07370419492536907748609097595Segmentation fault (core dumped)

Ответы [ 3 ]

0 голосов
/ 31 марта 2019

Указатель p, который вы создаете во вводе, не зависит от указателя, который вы делаете в основном.Таким образом, вы не можете получить доступ к массиву, который вы создаете во входе, когда вы вернетесь в main.

Если это то, что вы хотите сделать, вы "не можете" удалить p во входных данных, вернуть его в main, использоватьэто в основном, а затем удалить его в основном.Однако разделение нового и удаление такого типа не лучшие практики кодирования.

Если вы не хотите использовать массив в main, вы должны удалить любую ссылку на p в основной функции, нет необходимости устанавливать ее вnull и, конечно, не удаляйте его.

0 голосов
/ 31 марта 2019

Этот код отлично работает под clang, g ++ и vc ++. Пример: https://rextester.com/PBN39654

Это заставляет меня думать, что в вашей среде что-то не так, что вы создаете код, или что-то еще вызывает дамп ядра после успешного возвращения main. Как вы строите это демо?

Однако есть вещи, которые вы можете улучшить. Например:

  • Не используйте DMA вручную ... Попробуйте использовать std::vector
  • Всегда инициализируйте ваши переменные. Неинициализированные нестатические локальные (ограниченные) переменные, такие как n,d и count, будут получать значения мусора.
  • x нигде не используется. Убери это.
  • int *p = NULL имеет несколько недостатков, один из которых NULL. NULL - это макрос для 0. Если вы хотите создать указатель, который ни на что не указывает, используйте nullptr. Во-вторых, int *p не имеет ничего общего с указателем в функции, поэтому он бесполезен. Убери это.

Вот демонстрация обновленного примера: https://rextester.com/BUTV13117

0 голосов
/ 31 марта 2019

Я проверил ваш код, и для меня он работает без проблем.

Если вы выделяете пространство в main (), то вы также должны обычно освобождать его и в main ().

...