C ++ FAQ Lite的16.15节讨论delete this然后提到:
自然,通常的警告适用于以下情况:当您的指针是没有虚拟析构函数的基类的指针时。
为什么会这样呢?考虑以下代码:
class ISuicidal {
public:
virtual void suicide() = 0;
};
class MyKlass : public ISuicidal {
public:
MyKlass() {
cerr << "MyKlass constructor\n";
}
~MyKlass() {
cerr << "MyKlass destructor\n";
}
void suicide() {
delete this;
}
};
Run Code Online (Sandbox Code Playgroud)
因此使用:
int main()
{
ISuicidal* p = new MyKlass;
p->suicide();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调用中p->suicide(),即使没有虚拟析构函数MyKlass,也会ISuicidal按预期调用的析构函数。
在我看来,这是有道理的,因为在中MyKlass::suicide,this已知的静态类型为MyKlass*,因此将调用正确的析构函数。通过在 …
我正在为游戏写一个州经理.我已经掌握了大部分逻辑,因为我想要这样做.我希望状态(将是类)在StateManager类的堆栈中处理.每个状态都有暂停功能,堆栈将是STL堆栈.
当状态完成它需要做的事情时(例如:从暂停屏幕,用户点击"返回游戏"),它需要从堆栈中删除并删除.我现在的逻辑(不幸的是我无法测试)是这样的:
州完成其工作.在它的更新函数中,当它发现它完成时,它将调用一个函数来清理状态.此函数将处理需要绑定的任何立即松散的结束(如果有),从状态管理器堆栈调用pop函数,并删除自身.
我要问的是:我可以从内部删除一个类吗?
我有一个卸载脚本,可以清理与应用程序一起使用的附加工具.该脚本的版本在Windows和Linux上运行.
我希望能够删除卸载脚本文件以及脚本运行的目录(在Windows批处理文件的情况下以及Linux bash文件的情况下).现在除了脚本和运行它的目录之外的所有内容在运行后仍然存在.
如何删除脚本和脚本的目录?
谢谢
鉴于以下内容:
#include <iostream>
using namespace std;
class A
{
public:
void func() {delete this;}
A() : x(5) {cout << "ctor A" << endl;}
~A() {cout << "dtor A" << endl;}
int x;
};
int main() {
A a;
cout << "The X value: " << a.x << endl;
a.func(); // calling 'delete this' ->going to the dtor #1
cout << "The X value: " << a.x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
ctor A
The X value: 5
dtor A …Run Code Online (Sandbox Code Playgroud) Objective-C中的对象自杀是一种好习惯吗?也就是说,对象要声明[self dealloc]哪里-dealloc允许像往常一样有序地降温?主要风险是什么?
碰巧我有一个特定的例子,一个自定义计时器对象,它扩展NSObject并包含一个NSTimer实例和一个NSUInteger,它被设置为限制计时器触发的次数.当时间到了,对象告诉计时器-invalidate,然后通过调用它的-dealloc方法自杀.由于这是自动的,我们不必担心必须跟踪对象或关键地知道何时是解除分配它的正确时刻.
如需更详细的说明,请参见我的文章在这里.
因此,我在列表中有一些对象。我想使我的对象具有一个方法,该方法在被调用时将从列表中删除。我该怎么办?
c++ ×3
bash ×1
batch-file ×1
c# ×1
dealloc ×1
destructor ×1
nstimer ×1
object ×1
objective-c ×1
polymorphism ×1
windows ×1