- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
C++ 在一些主对象的析构函数中在堆栈上创建一个工作对象并将主对象的 this
指针传递给辅助对象是否合法?然后,辅助对象还将调用主对象的成员函数或访问成员变量。
也就是说,下面的C++是合法的吗?
struct MasterClass
{
MasterClass (int data);
~MasterClass ();
int data;
};
struct WorkerClass
{
WorkerClass (MasterClass *m) : m (m) { }
void do_some_work () { m->data = 42; }
MasterClass *m;
};
MasterClass::MasterClass (int data)
: data (data)
{ }
MasterClass::~MasterClass ()
{
WorkerClass w (this);
w.do_some_work ();
}
int main ()
{
MasterClass m (7);
}
我知道一旦析构函数开始执行,主对象的生命周期就结束了。但我相信在任何对象的析构函数中调用非虚拟成员函数是合法的,它使用隐式的 this
参数。
最佳答案
是也不是。
是的,因为在您展示的这个非常短的示例中它是合法的。
不,因为它可能会导致 UB,所以在销毁过程中使用对象有一些注意事项
TLDR 如果你没有任何继承权总是没问题的。
现在,对于在销毁过程中不使用对象的情况。
以下情况将假定以下内容已写好
struct V;
struct A;
struct B;
struct D;
void foo(A* a = nullptr);
struct V {
virtual void f();
virtual void g();
};
struct A : virtual V {
virtual void f();
};
struct B : virtual V {
virtual void g();
~B() {
foo();
}
};
struct D : A, B {
virtual void f();
virtual void g();
~D() {
foo(this);
}
};
int main() {
D d;
}
在 x
销毁时(也就是调用其析构函数时)
If the virtual function call uses an explicit class member access and the object expression refers to the complete object of
x
or one of that object's base class subobjects but notx
or one of its base class subobjects, the behavior is undefined.
这意味着,如果您使用显式类成员访问来调用一个指针指向整个 x
的虚函数,但不知何故指针不是 x 的类型
及其基础,行为未定义。
void foo(A* a) {
static auto ptr = a;
ptr->g(); // UB when called from ~B
// ptr refers to B, but is neither B nor its base
}
typeid
If the operand of
typeid
refers to the object under construction or destruction and the static type of the operand is neither the constructor or destructor's class nor one of its bases, the behavior is undefined.
同样,如果操作数指的是被析构的对象,但不知何故不是对象及其基类,则行为未定义。
void foo(A* a) {
static auto ptr = a;
typeid(*ptr); // UB when called from ~B()
// ptr refers to B, but is neither B nor its base
}
dynamic_cast
If the operand of the
dynamic_cast
refers to the object under construction or destruction and the static type of the operand is not a pointer to or object of the constructor or destructor's own class or one of its bases, thedynamic_cast
results in undefined behavior.
同样的交易。
void foo(A* a) {
static auto ptr = a;
dynamic_cast<B*>(ptr); // UB when called from ~B()
// ptr refers to B, but is neither B nor its base
}
现在,如果您认为这是一场惨败并且不明白发生了什么,请不要在析构函数中的任何地方传递 this
。
关于c++ - 将 "this"指针传递给析构函数中的其他类/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861245/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!