【问题标题】:C++ internals: Messing with the this-pointerC++ 内部结构:弄乱 this 指针
【发布时间】:2011-04-19 10:10:00
【问题描述】:

我对 C++ 的内部运作有一些疑问。例如,我知道一个类的每个成员函数都有一个隐含的隐藏参数,即 this 指针(与 Python 的做法非常相似):

class Foo 
{
    Foo(const Foo& other);
};

// ... is actually...

class Foo
{
    Foo(Foo* this, const Foo& other);
};

然后假设函数的有效性不直接取决于 this 的有效性(因为它只是另一个参数),我有错吗?我的意思是,当然,如果您尝试访问 this 指针的成员,它最好是有效的,但如果 this 被删除,该函数将继续运行,对吧?

例如,如果我弄乱了 this 指针并执行如下所示的操作怎么办?这是未定义的行为,还是由高度气馁定义的? (我只是出于好奇而问。)

Foo:Foo(const Foo& other)
{
    delete this;
    this = &other;
}

【问题讨论】:

    标签: c++ this this-pointer


    【解决方案1】:

    您不能分配给this - 它是Foo * const 类型。在某些情况下,您可以delete this;,但这并不是一个好主意。

    【讨论】:

    • 如果我抛弃 const-ness 怎么办?
    • 我确定标准中没有具体定义,但它的定义不是隐含的吗?抛弃 const-ness 是定义的,从纯技术的角度来看 this 只是另一个参数,删除和分配指针显然是定义的......还有什么没有定义的?
    • @Paul:参见 7.1.5.1/4 - 简而言之,尝试修改真正是 const 的东西会产生 UB
    • @Paul:另外,请参阅 3.10 关于左值/右值。 this 不是左值。
    • 几个误区:this的类型是Foo*;没有常数。但这不是一个变量。它是一个关键字,代表一个右值(这就是为什么没有 const),比如42。您不能分配给this 或修改它,就像您不能分配或修改42 一样。而delete this 是一个常用的成语;在某些应用程序中,它几乎是 delete 的唯一用途。
    【解决方案2】:

    this 定义为,

    Foo(Foo* const this, ...);
    

    对于this(特殊情况),抛弃constness 不是不可能。编译器会给出相同的错误。我已经问过similar question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2013-05-22
      • 1970-01-01
      相关资源
      最近更新 更多