如何使用delete []运算符清除动态分配的内存? (无法使用常规删除语法清除)

时间:2019-03-31 10:48:47

标签: c++ memory-management dynamic segmentation-fault delete-operator

我已经使用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 :(得分:0)

我已经测试了您的代码,对我来说它可以正常运行。

如果您在main()中分配空间,那么通常也应该在main()中分配空间。

答案 1 :(得分:0)

您在输入中创建的指针p独立于您在main中创建的指针。因此,当您回到main时,您将无法访问您在输入中创建的数组。

如果这是您要执行的操作,则不能“删除”输入中的p,将其返回到main,在main中使用它,然后在main中删除它。但是,像这样拆分new和delete并不是最佳编码实践。

如果不想在main中使用数组,则应删除main函数中对p的任何引用,无需将其设置为null,当然也不要删除它。

答案 2 :(得分:0)

此代码在clang,g ++和vc ++下可以正常工作。 示例:https://rextester.com/PBN39654

这使我认为构建代码的环境有问题,或者在main成功返回后又触发了核心转储。您如何构建此演示?

但是,有些事情可以改进。 例如:

  • 不要手动使用DMA ...尝试使用std::vector
  • 始终初始化变量。未初始化的非静态局部(作用域)变量(例如n,dcount)将收到垃圾值。
  • x不在任何地方使用。删除它。
  • int *p = NULL有几个缺陷,其中一个是NULLNULL0的宏。如果确实要创建一个指向什么都没有的指针,请使用nullptr。其次,int *p与函数中的指针无关,因此没有用。去掉它。

这是更新示例的演示:https://rextester.com/BUTV13117