【问题标题】:Can't delete a dynamic object in C++ [duplicate]无法在 C++ 中删除动态对象 [重复]
【发布时间】:2019-02-03 03:28:32
【问题描述】:

我在 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 or can't print "Vu Trung Nghia 20" 实际结果:“Vu Trung Nghia 20”

【问题讨论】:

  • 您是否遇到分段错误?
  • C++ 程序是懒惰的。他们做了完成工作所需的绝对最低限度。从好的方面来说,这就是让他们快速的原因。不利的一面是,它们给你留下了很大的余地,让你在脚上被击中。除非 C++ 标准明确声明它会发生,否则不要假设您没有要求的任何事情。如果您不确定,请查看。如果你仍然不确定,假设你必须自己做。

标签: c++


【解决方案1】:

我希望结果是:p == NULL

没有理由期待这一点,因为您从未分配过p = NULL

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

这是预期的行为。删除指针对指针的值没有影响。

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

访问已销毁对象的行为未定义。你永远不希望你的程序有未定义的行为。

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

那么删除指针到底是什么?

假设指针指向一个用new 分配的对象,那么delete 会破坏指向的对象,并释放内存。重新分配意味着后续的new 可以重新使用该内存。

【讨论】:

  • 那么删除指针到底是什么?
  • @NghĩaVũTrung 查看编辑。
  • @NghĩaVũTrung 关于后续新的可能会重复使用该内存。这可能不会很快发生,让您留在该内存中的内容既可访问又相同,愚弄您当它只是在等待一个合适的时机让你的生活变得更加困难时,你会认为它是有效的。
【解决方案2】:

delete 从内存中释放指针,它确实 改变它的值或地址,值保持在那里,你在deleteing 之后执行的调用会调用 分段错误(可以很容易地翻译成你的程序有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...
    }
};

【讨论】:

  • 术语:p = nullptr; // Stop memory leaking... 泄漏已经停止。这(通常)使得在删除指针后立即使用它是致命的。在 void students::operator delete ( void* ptr ) ptr 中已按值传递。更改它指向的位置对调用者没有影响。
猜你喜欢
  • 2018-03-11
  • 2022-01-08
  • 2020-10-29
  • 2021-06-23
  • 2012-04-06
  • 2016-04-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
相关资源
最近更新 更多