【问题标题】:Delete inside of class删除类内
【发布时间】:2013-07-27 11:04:17
【问题描述】:

我遇到了一些奇怪的问题。我在类方法中使用删除运算符,我想知道如何解决这个问题。

这是代码:

#include <iostream>

using namespace std;

class A
{
    public:
        int a;

        ~A() {
            cout << "call ~A()" << endl;
        }

        void action()
        {
            /* code here */
            delete this; //this line depends on some if statements
            /* code here */
        }

        void test2() {
            cout << "call test2()" <<  a << endl;
        }

        void test() {
            a = 10;
            cout << "call test()" << endl;

            action();

            //how can I check if data is deleted?
            test2();
        }
};

int main()
{

    A* a = new A();
    a->test();

}

如何检查删除操作符是否删除了数据? 有可能吗?

【问题讨论】:

  • 您正在删除类的非静态成员函数中的实例。我认为您需要问自己“我想要实现什么目标?”
  • 例如我得到了 gui,当这个窗口的子按钮调用 action closeWindow() 我需要删除窗口,但不知道具体如何,我认为这将是最快的方式或使用某种调度员
  • 你需要销毁实际的窗口,但谁说你需要删除代表这个窗口的C++类的实例?如果您正在处理 Windows 消息,这里是some information。我建议您也阅读 cmets,Remy Lebeau 提供了有关如何在 Borland VCL 中完成的有趣见解。

标签: c++ class delete-operator


【解决方案1】:
  1. 使用delete this; 几乎总是“不好的”。有例外,但那些真的很不寻常。想想你想要做什么。大多数情况下,这意味着您应该有一个包装器对象和一个由包装器对象创建/删除的内部对象。

  2. 您无法检查是否已删除某些内容(以可靠的方式/便携方式)。在您的特定测试用例中,您正在通过“在对象被破坏后使用它”来执行“未定义的行为”,这意味着您无法真正知道会发生什么。您必须相信 delete 会按照标签上的说明执行 C++ 运行时。

【讨论】:

    【解决方案2】:

    在 C++ 中,除了void 之外,还有其他可用的返回值。因此,您的 action 可以返回指示 this 是否已被删除的内容。

    请注意,在删除this 后,您不应访问任何非静态数据成员或调用任何非静态成员函数。有些人觉得很难保证,所以干脆把delete this给封了。

    注意反对者C++ FAQ 声称delete this 是合法的构造,我也没有发现任何禁止它的东西。

    【讨论】:

    • 实际上,避免访问非静态数据就足够了,但严格来说,您可能仍在调用 UB。只是不要这样做。
    • 我无法从标准中找到该案例的 UB。你能显示在哪里吗?我不是这种自有物品的忠实粉丝。有时这样可能是合理的。然后删除这可以避免人工所有者和仍然以相同情况结束的owner-&gt;deleteMe(this) 膨胀:可能访问任何非静态内容。
    • 我明白了。我认为当 action() 将返回例如布尔值时,它仍然是错误的方式,这就是我创建这个问题的原因,无论如何谢谢:P
    • @ÖöTiib:该标准并未列出所有未定义的情况。相比之下,未定义的案例是……未定义的。当您在成员函数中时,预计拥有对象存在。就那么简单。 delete this 基本上没有任何合理的地方——你搞砸了所有权语义。
    • @LightnessRacesinOrbit 例如,一些活动对象必须是自有的,因为它们是所有权树的根。人为地使它们不是 root 会增加并发问题而没有任何好处。
    猜你喜欢
    • 2019-04-09
    • 2018-01-12
    • 2010-11-12
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多