我已经创建在C动态对象++使用指针。我设置动态对象的值。然后删除指针,但是当我尝试打印动态对象的值时,它保持不变。
我尝试打印指针的值,该值是动态对象的地址,在删除指针之前和之后它保持不变。
#include<iostream>
using namespace std;
struct students
{
string name;
int agee;
};
int main()
{
students *p = NULL;
p = new students;
(*p).name = "Vu Trung Nghia";
(*p).agee = 20;
cout << p->name << " " << p->agee << endl;
delete p;
if(p == NULL)
cout << "It was deleted";
else
cout << (*p).name << " " << (*p).agee << endl;
}
我希望结果是:p == NULL或无法打印“ Vu Trung Nghia 20” 实际结果:“ Vu Trung Nghia 20”
答案 0 :(得分:2)
我希望结果是:p == NULL
没有理由期望,因为您从未分配过p = NULL
。
我尝试打印指针的值,该值是动态对象的地址,在删除指针之前和之后它保持不变。
这是预期的行为。删除指针不会影响指针的值。
但是当我尝试打印动态对象的值时,它保持不变。
访问被破坏对象的行为是不确定的。您永远都不希望您的程序具有未定义的行为。
当行为未定义时,可能会发生任何事情。 “我尝试打印动态对象的值,它保持不变。” 是可能的行为之一。
那么删除指针实际上是什么?
假设指针指向已用new
分配的对象,则delete
销毁所指向的对象并释放内存。解除分配意味着后续的new
可能会重新使用该内存。
答案 1 :(得分:0)
delete
将指针从内存中释放出来,它不更改其值或地址,该值保留在那里,您在delete
对其进行调用后所做的调用将调用< em>分段错误(可以轻松地翻译成具有Undefined behvaior的程序)...
这是人们在调用delete
...
delete p;
p = nullptr; // Stop memory leaking...
您还将发现您不再能够修改指针:-
(*p).name = "Hello!"; /* Value is freed/destroyed from memory, cannot be
modified anymore... */
或者只是重载自己的delete
运算符:
struct students
{
string name;
int agee;
void students::operator delete ( void* ptr ) {
std::free(ptr);
ptr = nullptr; // Stop memory leaking...
}
};