问题描述
我不太了解在C ++中使用指针。我的示例代码和问题如下:
int main()
{
int *ptr1,*ptr2;
int val1,val2;
ptr1 = new int;
val1 = 45;
ptr1 = &val1;
ptr2 = ptr1;
cout << *ptr2;
delete ptr1; //Crashed
}
之所以出现运行时错误,是因为我尝试删除val1的地址。那么我应该怎么删除ptr1和ptr2?
解决方法
您只能将从delete
获得的东西传递给new
。由于您将new
修改为包含ptr1
,所以您没有保存从&val1
获得的值。因此,您无法delete
,因此您的代码有内存泄漏。您可以这样修复它:
int main()
{
int *ptr1,*ptr2,*ptr3;
int val1,val2;
ptr1 = new int;
ptr3 = ptr1; // save the value we got from new so we can delete it later
val1 = 45;
ptr1 = &val1; // ptr1 no longer contains the value we got from new
ptr2 = ptr1; // ptr2 and ptr1 both contain &val1 now
cout << *ptr2;
delete ptr3; // pass the value we got from new to delete
}
,
因为val1不在堆内存中。