无法在C ++中删除动态对象

时间:2019-02-03 03:28:33

标签: c++

我已经创建在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”

2 个答案:

答案 0 :(得分:2)

  

我希望结果是:p == NULL

没有理由期望,因为您从未分配过p = NULL

  

我尝试打印指针的值,该值是动态对象的地址,在删除指针之前和之后它保持不变。

这是预期的行为。删除指针不会影响指针的值。

  

但是当我尝试打印动态对象的值时,它保持不变。

访问被破坏对象的行为是不确定的。您永远都不希望您的程序具有未定义的行为。

当行为未定义时,可能会发生任何事情。 “我尝试打印动态对象的值,它保持不变。” 是可能的行为之一。

  

那么删除指针实际上是什么?

假设指针指向已用new分配的对象,则delete销毁所指向的对象并释放内存。解除分配意味着后续的new可能会重新使用该内存。

答案 1 :(得分:0)

  

delete将指针从内存中释放出来,它更改其值或地址,该值保留在那里,您在delete对其进行调用后所做的调用将调用< em>分段错误(可以轻松地翻译成具有Undefined behvaior的程序)...

这是人们在调用delete ...

后将指针设置为 NULL 的原因。
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...
    }
};