何时/如何在使用指针后正确删除指针?

When/How to correctly delete pointers after using them?

本文关键字:指针 删除 何时      更新时间:2023-10-16

只是学习指针并正在解决这个问题,我很困惑。只要我在使用指针后删除它们,那么我应该可以使用它们,这显然不是这样,因为它不起作用。我使用new,它在堆上分配内存,但它从堆栈中获取地址,是那里的问题,一些澄清和最佳实践建议将不胜感激。

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
// initialize variables
double hours=0.0,rate=0.0,overtime=0.0,pay = 0.0;
double *dptr1 = new double;
double *dptr2 = new double;
double *dptr3 = new double;
// getting input from user
cout << "Enter standard hours worked: ";
cin >> hours;
cout << "Enter rate of pay: ";
cin >> rate;
cout << "Enter overtime hours(enter 0 for no overtime): ";
cin >> overtime;
dptr1 = &hours;
dptr2 = &rate;
dptr3 = &overtime;

// calculate pay
pay = hours * rate + (1.5 * rate * overtime);
// print out the results
cout << setw(4) << "Standard Hours " << setw(8) << "Rate " << setw(12) << "Overtime " << setw(16) << "Pay " << endl;
cout.setf(ios::floatfield,ios::fixed);
cout <<setprecision(0)<< setw(8) << *dptr1 <<setprecision(2)<< setw(13)<< *dptr2 <<setprecision(0)<< setw(13)<< *dptr3 << setw(18)<<setprecision(2)<<pay;
delete dptr1;
delete dptr2;
delete dptr3;

}

> 指针是一个变量,旨在指向某个地方。它要么不指向任何地方,必须设置为保存nullptr值,要么保存地址。

问题是地址的来源。

它可能来自堆,这正是new所做的。new是一种说"嘿,从堆中动态分配给定类型的值并给我该地址"的方式,这是您应该注意稍后调用delete的地方,以便将先前分配的存储返回堆。

或者,您可以询问变量的地址,该变量不是动态分配的,而是在堆栈上自动创建的。&运算符就是这样做的。

代码段使用指针变量执行以下操作:

  • 使用new在堆上动态分配存储

  • 获取堆栈上现有变量的地址,因此动态分配的存储已泄漏

  • delete一些东西,不是来自堆

如果使用 new 分配一段内存,它将始终存在,直到您为此地址调用 delete。 如果丢失此地址,则在程序结束之前不会释放内存。这称为内存泄漏。