销毁对象放置新后未调用析构函数

2024-04-02

我不知道为什么这不起作用。下列Function是通过放置 new 创建的。提供了一个函数来检查它是否应该被破坏,如果是,则手动调用其析构函数。

这是测试用例,似乎从未调用析构函数:

/* Represents a function at runtime */ 
class Function {
public:
  /* Creates an invalid function */
  Function():codeptr(0) { }

  /* Creates a function with the given code pointer */
  Function(void *codeptr):codeptr(codeptr) { }

  /* Frees the function machine code */
  ~Function() {
    if(*this) {
      /* <- I explicitly put a debug output here! */
      destroyLLVMCode(codeptr);
    }
  }

public:
  /* Returns true if the function is valid 
   * (if the code pointer is non-null)
   */
  operator bool() const { return codeptr != 0; }

  /* Destroy this function by calling its destructor */
  void destroy() { ~Function(); }

private:
  void *codeptr;
};

我像下面这样使用它。将下面仍然存在问题的代码减少到最少。当然,在我的实际程序中,内存是通过分配器以另一种方式分配的。

#include <new>
#include <cstdlib>

int main() { 
  void *buffer = std::malloc(sizeof(Function));
  Function *f = new (buffer) Function(someExecutableLLVMCode);
  /* more code .. register with symbol tables etc.. */
  f->destroy();
}

你可以看到我在行中调用析构函数~Function()。编译器接受,但它最终不会调用它:我通过检查它是否真的删除了我给它的 LLVM 代码来验证它(在删除 LLVM 代码之前将一些代码放入析构函数中)codeptr指向,如果Function已验证)。

后来我才知道是什么原因造成的。您能给我一个解释吗?


这是因为~Function();这里在语法上不是析构函数调用。使用this->~Function();反而。

~Function();被解析为运算符~和创建Function堆栈上的对象。Function类有一个operator bool这就是为什么要编译这个的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

销毁对象放置新后未调用析构函数 的相关文章

随机推荐

  • 如何做一个连续回收UIView动画

    下面的代码将图像视图从右向左移动一次 但我想连续这样做 从右向左移动 然后在屏幕外向左移回 然后再次从右向左重复 imageview UIImageView alloc initWithFrame CGRectMake 320 200 26
  • PHP 中的一行 if 语句

    我想要一些类似于 JavaScript 的东西 var foo true foo doSometing 但这似乎在 PHP 中不起作用 如果满足条件 我会尝试向标签添加一个类 并且为了可读性 我希望将嵌入的 PHP 保持在最低限度 到目前为
  • 如何做到“如果单击其他..”

    我正在尝试使用 jQuery 来做类似的事情 if jQuery id click do some stuff else run function2 但我不确定如何使用 jQuery 来做到这一点 任何帮助将不胜感激 Edit 我正在尝试运
  • 我们可以动态添加文本字段吗

    我在我的聊天机器人中创建了一个自适应卡 使用 json 它接受用户的输入 我想添加一个按钮 使用户每次单击插入字段时都可以添加新的文本字段 即 用户可以单击插入按钮输入教育详细信息 学校 学院等 这可以在自适应卡中实现吗 我也想知道 自适应
  • 在文本段中创建具有给定大小的 C 函数

    我正在编程一个嵌入式powerpc questions tagged powerpc32位系统具有32 kbyte 8路组相联二级指令缓存 为了避免缓存抖动 我们以某种方式对齐函数 使得高频调用的一组函数的文本 想想中断代码 最终出现在单独
  • 在 Flash 对象内滚动时防止网页滚动

    我确信这一定是一个常见问题 但我在其他地方没有找到答案 我在一个长网页中嵌入了一个 Flash 对象 我侦听 Flash 中的 MOUSE WHEEL 事件 并相应地滚动 Flash 内容 但是 当我滚动 Flash 对象时 网页也会滚动
  • CORS 在 wso2 身份服务器中被阻止

    我将 WSO2is 5 7 0 与我的 Angular 6 应用程序一起使用 我尝试从我的应用程序进行 api 调用 但出现 cors 错误 Cross Origin Request Blocked The Same Origin Poli
  • 使用 telephonyserivce.endcall() 在 android 中结束通话

    我正在开发一个应用程序 我想在其中结束拨出呼叫 这是主要课程 import android app Activity import android content ActivityNotFoundException import andro
  • iPhone 游戏开发者 - 你们的工具链是什么样的?

    例如 源代码控制 git adobe驱动 3d 谷歌sketchup gt dae gt 搅拌机 gt obj 2d photoshop illustrator gt png 音频 大胆 gt caf 代码 ArgoUML Xcode Te
  • 使用 xcworkspace 时一直收到 ld:找不到 -lBolts 的库

    你好 这是我的Podfile Uncomment this line to define a global platform for your project platform ios 8 4 Uncomment this line if
  • 如何更改微调器文本大小和文本颜色?

    在我的 Android 应用程序中 我使用 spinner 并且我已将 SQLite 数据库中的数据加载到 spinner 中 并且它工作正常 这是代码 Spinner spinner Spinner this findViewById R
  • 如何以与参考线本身相同的角度注释参考线?

    我需要找到一种方法以与参考线本身相同的角度注释参考线 以下语句将生成参考线及其上方的标签 但是 线的斜率可能会发生变化 我需要找到一种方法来确保注释始终处于相同的角度 plot 1 10 1 10 abline a 8 b 1 text x
  • 是否可以自定义使用 Spring Native(使用 buildpack)生成的 docker 镜像

    我目前正在开发一个 Spring Native 应用程序 它使用 paketo buildpack 进行构建并生成 Docker 映像 我想知道是否可以通过添加第三方工具 例如 Datadog 代理 来自定义生成的 Docker 映像 另外
  • 大十进制乘法

    我尝试将两个相乘BigDecimal价值观与multiply方法如下 BigDecimal dur BigDecimal valueOf 60 1 1 BigDecimal bal BigDecimal valueOf 1 1 BigDec
  • 如何在 Windows 中使用批处理脚本创建符号链接?

    我当前正在使用以下脚本将具有特定前缀的所有文件复制到目标目录 for f delims k in dir d Search Path File Prefix s b do copy k d Target Directory 这工作正常 但我
  • Rails 文件下载和查看更新 - Howto?

    这看起来应该是直截了当的 但我很难过 我有一个视图控制器的链接 最终使用 send data 将文件下载到用户的硬盘驱动器 这非常有效 并且它使当前视图显然没有受到影响 但现在我希望页面在下载完成后提供一些反馈 在调用 send data
  • 用户、组和角色的多对多声明式 SQLAlchemy 定义

    我是 SQLAlchemy 的新手 想知道定义此类表和关系的最佳方法是什么 我希望能够通过以下方式访问用户组user groups 分组中的用户group users 并找出用户在组中的角色 我假设将在关联模型中定义逻辑 我还想按组选择所有
  • 如何将perl6文件编译为exe

    我正在使用基于 Windows 上 MoarVM 构建的 perl6 版本 我创建了一些 perl6 文件并想将其编译为 exe 我尝试了以下方法 perl6 target MAST r pl gt r 现在我想将 r 编译为可执行文件 我
  • ListView 带有 longClick 用于显示和隐藏复选框?

    我沿着代码在这里 网络链接 http windrealm org tutorials android listview with checkboxes without listactivity php并且代码稍微修改了一下 变成了这样 文件
  • 销毁对象放置新后未调用析构函数

    我不知道为什么这不起作用 下列Function是通过放置 new 创建的 提供了一个函数来检查它是否应该被破坏 如果是 则手动调用其析构函数 这是测试用例 似乎从未调用析构函数 Represents a function at runtim