指针功能删除?和指向指针崩溃的指针(c ++)

时间:2017-05-01 15:10:04

标签: c++ function pointers

我是c ++的新手,我使用的是代码块

1 / 指向指针的指针

int **pp = new int*;
cout<<*pp<<endl;
{
    int *p = new int;
    pp = &p;
    cout<< *pp<<endl;

}

之后如果我写delete pp,我就会“.exe已停止工作”。我想这是因为我试图删除它所指向的引用而且不允许这样做。我只是让pp成为了吗?我不能删除它吗?如果我要创建大量指针指针,我是否有内存泄漏的风险?

1 / 指针功能删除? 我有:

int* fct_ptr(int &a, int &b)
{
    int* ptr=new int;
    if (a>b)
        ptr=&a;
    else
        ptr=&b;

    return ptr;
}

如何释放我用于fct_ptr的指针? 正在写delete fct_ptr(int_value1, int_value2)吗?但是我怀疑我的fct_ptr(int_value1, int_value2)只是一个指针,它的参数是通过分配引用的,例如int* a=new int; int*b=a;,所以它意味着ptr不能以这种方式被删除...... 那么如果我多次调用那个fct就不会有内存泄漏? 我可以写int* ptr; int* ptr = new int*;来解决问题。 但我想知道如何解决它而不改变ptr的声明

伯努瓦。

1 个答案:

答案 0 :(得分:0)

您只需要确保释放已使用new分配的所有内存,不要担心指针本身。

因此,对于第一个代码块,当您重新分配pp时,您已经分配了第一个对象(new int*)的内存泄漏,因为当您分配pp = &p时,您可以< em>永远到达前一个内存对象*pp指向的内存地址。

规则是,对于每个new,必须有一个delete。因此,如果确实想要使用T* p = new T声明,则需要输入

    int **pp = new int*; //(1)
    {
      int *p = new int; //(2)
      delete pp; //make sure (1) is deallocated, will never be reached otherwise
      pp = &p;
      delete p; //make sure (2) is deallocated, will never be reached otherwise
    }

对于(2),变量p仅存在于范围中,并且您只能通过它到达(2),因此您还需要在范围中删除它。正如评论中所述,pp现在指向未定义的内容。

对于第二种情况,每次调用函数fct_ptr时,都会在堆栈上分配一个永远不会被释放的int。所以这里的解决方案也是

int* fct_ptr(int &a, int &b)
{
    int* ptr=new int;
    delete ptr;
    if (a>b)
        ptr=&a;
    else
        ptr=&b;

    return ptr;
}

但是,当然,如果您从不使用该对象,则 no 需要为指针指向的内容分配内存。因此,如果您不确定要取消引用int* ptr;,请先写下ptr,然后再确定它是否指向某事。