我是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
的声明
伯努瓦。
答案 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
,然后再确定它是否指向某事。