何时/如何在使用指针后正确删除指针?
When/How to correctly delete pointers after using them?
只是学习指针并正在解决这个问题,我很困惑。只要我在使用指针后删除它们,那么我应该可以使用它们,这显然不是这样,因为它不起作用。我使用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。 如果丢失此地址,则在程序结束之前不会释放内存。这称为内存泄漏。
相关文章:
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存