在我最初的基本测试中,这样做是完全安全的.然而,它已经让我吃惊试图操纵this该功能后delete小号this可能是一个运行时错误.这是真的,通常是安全的delete this吗?或者只有某些安全的情况?
今天,我看到了一些遗留代码.在析构函数中有一个类似" delete this" 的语句.我想,这个调用将是递归的.它为什么有效?
我在Y!上做了一些快速搜索,我发现如果需要限制用户创建堆栈对象,我们可以将析构函数设为私有,并提供删除实例的接口.在提供的接口中,我们必须在此指针上调用delete.
是否还有其他使用此类陈述的情况?
我刚刚在programmers.stackexchange上遇到过这个问题,并且看到了关于在delete this;成员函数内部进行操作的问题.
根据我的理解,这通常是禁止的,但是在某些情况下这可能是有用的.什么时候会有用,哪些技术原因没有?
我正在做一些类似 y 组合器的 lambda 包装的实验(尽管我知道它们实际上并不是严格意义上的 y 组合器),但我遇到了一个非常奇怪的问题。我的代码在调试配置中完全按照我的预期运行(关闭优化),但跳过了发布中的大(而且很重要!)位(设置为Optimizations (Favor Speed) (/Ox))。
请注意,lambda 函数的内部基本上无关紧要,它们只是为了确保它可以正确递归等。
// main.cpp
#include <iostream>
#include <string>
#define uint unsigned int
// Defines a y-combinator-style thing to do recursive things. Includes a system where the lambda can declare itself to be obsolete.
// Yes, it's hacky and ugly. Don't worry about it, this is all just testing functionality.
template <class F>
class YCombinator {
public:
F m_f; // the lambda will be stored here
bool m_selfDestructing = …Run Code Online (Sandbox Code Playgroud) 我正在为游戏写一个州经理.我已经掌握了大部分逻辑,因为我想要这样做.我希望状态(将是类)在StateManager类的堆栈中处理.每个状态都有暂停功能,堆栈将是STL堆栈.
当状态完成它需要做的事情时(例如:从暂停屏幕,用户点击"返回游戏"),它需要从堆栈中删除并删除.我现在的逻辑(不幸的是我无法测试)是这样的:
州完成其工作.在它的更新函数中,当它发现它完成时,它将调用一个函数来清理状态.此函数将处理需要绑定的任何立即松散的结束(如果有),从状态管理器堆栈调用pop函数,并删除自身.
我要问的是:我可以从内部删除一个类吗?
可能重复:
对象是否应该在C++中删除自己?
在我的应用程序中,我正在创建许多"拥有自己"的对象 - 在创建它们并告知它们"go"之后,只有对象本身才能确定何时应该删除它.
例如,如果我正在编写游戏,我可能会有多个Enemy对象.只有Enemy对象知道什么时候应该死掉.
结果,我最终delete this在Enemy对象内部使用了一些成员函数.这是不好的形式?这是我应该避免的,如果是这样,处理这种情况的正确方法是什么?