RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 927309
Accepted
Глеб
Глеб
Asked:2020-12-31 22:15:26 +0000 UTC2020-12-31 22:15:26 +0000 UTC 2020-12-31 22:15:26 +0000 UTC

如何在 C++ 中删除类的实例?

  • 772
#include <iostream>

using namespace std;

class A
{
    public:
        int a;
        A()
        {
            a=2;
        }
        ~A()
        {
            a=1;
        }
};

int main()
{
    A * aa = new A();
    delete aa;
    if (aa)
    cout<< aa->a;
    else
    cout<<"123";
}

我创建了一个指向类实例的指针,我调用构造函数,变量“a”包含数字 2。我调用析构函数(其中这个“a”应该等于 1)。首先,我检查是否有指向该类实例的指针。原来,不仅在析构函数之后存在,数字0也位于“a”中,原来0开始位于内存中,但还是被程序占用了?如何从内存中删除一个类的整个实例?如果我用丢失的类替换对类的引用(在本例中为“aa”),那么(逻辑上)这不会释放内存,而只会允许我不再通过这个引用来管理这个内存。

c++
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    HolyBlackCat
    2020-12-31T22:38:05Z2020-12-31T22:38:05Z

    [基本.stc]/4

    当一个存储区域的持续时间结束时,表示该存储区域任何部分地址的所有指针的值都变为无效指针值。通过无效指针值的方向以及将无效指针值传递给释放函数具有未定义的行为。 无效指针值的任何其他使用都具有实现定义的行为。

    (强调我的)

    之后delete aa;,指针aa变为无效,行为if (aa)取决于编译器。

    更重要的是,下一行 - aa->a- 由于通过无效指针访问而导致未定义的行为。

    由于未定义行为,因此争论您在控制台0或其他内容中看到的原因几乎没有意义。


    首先,我检查是否有指向该类实例的指针。

    delete不会使指针无效。所以检查不起作用。

    它不仅存在于析构函数之后

    他不存在”。该对象在调用析构函数1后不再存在。

    但是语言中没有办法检查指针是否指向“现有”对象。

    所以在“a”中也是数字 0

    a- 也不存在。从中读取是未定义的行为。

    原来零开始在内存中,但它仍然被程序占用吗?如何从内存中删除一个类的整个实例?

    “从记忆中删除”是什么意思?内存是字节的集合。您可以将对象所在的字节的值更改为其他一些,仅此而已。这些字节不能被“删除”。


    1更准确地说,是一个重要的析构函数,但这在这里并不重要。

    • 4
  2. Harry
    2020-12-31T22:24:09Z2020-12-31T22:24:09Z

    后

    delete aa;
    

    存储在变量中的指针的值aa 不会改变。

    它指向一个已经释放的内存块,它可以保持在相同的状态,被覆盖 - 通常,任何事情都可能发生在它身上(这就是未定义行为的用途)。无论如何,你不应该联系他——这不会带来任何好处。

    • 2
  3. Vlad from Moscow
    2020-12-31T22:19:08Z2020-12-31T22:19:08Z

    该程序具有未定义的行为,因为在删除类对象后

    delete aa;
    

    指针值aa变得无效。也就是说,指针不指向程序中现有的“活动”对象。

    请记住,调用函数运算符delete或delete[]不会更改指针的值。由于指针是按值传递给函数运算符的,也就是说,函数运算符处理的是原始指针值的副本。

    这意味着签入if-предложении将给出真实的

    if (aa)
        cout<< aa->a
    

    也就是说,aa它不是null-указатель

    但是,访问不再存在的对象的成员

        cout<< aa->a
    

    导致未定义的行为。

    • 1
  4. AR Hovsepyan
    2020-12-31T23:18:03Z2020-12-31T23:18:03Z

    我们把程序放大一点,这样会更清楚:

    struct A
    {
        int a;
        A(int k = 2) : a(k) {}
        ~A() {  a=1; }
    };
    

    程序:

    A * aa = new A();
    delete aa;
    if (aa)
        cout<< aa->a << '\t' << aa << endl;
    //
    else
        cout<<"123" << endl;
    A* bb = new A(1245);
    // может использоваться память содержащайся в аа а может и нет
    cout << bb << '\t' << bb->a << endl;
    
    // теперь хотим использовать и обьявленный b и адрес хранящийся в аа
    // размещаем в аа новый обьект
    bb = new(aa) A();
    //теперь оба указателья содержат один и тот же адрес
    cout << aa << '\t' << bb << endl
         << aa->a  <<'\t' << bb->a;
    

    编译器不知道程序员想要对分配的内存做什么(或不想做什么)。因此,не нужно如上所述проверить, указывает указатель на "существующий" объект, или нет, не только потому что нет в языке такого способа.

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5