从析构函数中调用虚函数

2023-11-22

这样安全吗?

class Derived:  public PublicBase, private PrivateBase
{
 ... 

   ~Derived()
   {
      FunctionCall();
   }

   virtual void FunctionCall()
   {
      PrivateBase::FunctionCall();
   }
}

class PublicBase
{
   virtual ~PublicBase(){};
   virtual void FunctionCall() = 0;
}

class PrivateBase
{
   virtual ~PrivateBase(){};
   virtual void FunctionCall()
   {
    ....
   }
}


PublicBase* ptrBase = new Derived();
delete ptrBase;

这段代码崩溃了有时IP 地址错误。

每个人都清楚在构造函数上调用虚函数不是一个好主意。

来自类似的文章http://www.artima.com/cppsource/nevercall.html我知道析构函数也是调用虚函数的不太好的地方。

我的问题是“这是真的吗?”我已经用 VS2010 和 VS2005 进行了测试,并调用了 PrivateBase::FunctionCall 。是未定义的行为吗?


我将在这里逆流而行……但首先,我必须假设你的PublicBase析构函数是虚拟的,否则Derived析构函数永远不会被调用。

从构造函数/析构函数调用虚函数通常不是一个好主意

原因是这两个操作期间动态调度很奇怪。对象的实际类型changes施工期间及其changes再次在破坏过程中。当执行析构函数时,该对象正是该类型,而不是派生自该类型的类型。动态调度始终有效,但是最终覆盖者虚拟函数的值将根据您在层次结构中的位置而变化。

也就是说,您永远不应该期望对构造函数/析构函数中的虚拟函数的调用以从正在执行的构造函数/析构函数的类型派生的任何类型执行。

But

在您的具体情况下,final覆盖者(至少对于层次结构的这一部分)是above你的水平。而且,你是不使用动态调度根本不。电话PrivateBase::FunctionCall();是静态解析的,并且实际上相当于对任何非虚拟函数的调用。事实上,该函数是virtual或不不影响本次调用。

So yes尽管您将被迫在代码审查中解释这一点,因为大多数人都了解该规则的口头禅,而不是其原因,但这样做很好。

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

从析构函数中调用虚函数 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • Monotouch全局异常处理

    我在野外发现了一只令人讨厌的虫子 但我无法确定它的具体情况 有没有办法拥有全局 Try Catch 块 或者有办法处理 Monotouch 中未处理的任何异常 我可以包起来吗UIApplication Main args 在 try cat
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier

随机推荐

  • 有没有办法减慢网络爬虫的速度,以便它能够获取代码?

    我写了一个宏去WU获取历史数据 大部分情况下 它是有效的 但是 我认为宏运行速度太快 无法从网站获取数据 https www wunderground com history daily us tx el paso KELP date 20
  • 谷歌翻译获取当前语言

    在网上找到任何可以帮助我的东西之后 我正在使用多语言网站的当前功能 function googleTranslateElementInit new google translate TranslateElement pageLanguage
  • 当另一个单元格更改时,在单元格中输入当前日期

    我有一个 Google 电子表格 用于跟踪客户端请求的应用程序配置信息的状态 例如 文本转到按钮上 我的顶部有一个 状态 列 下面的行中有一个 范围列表 数据验证单元格 使用的范围有 与客户 与我 已完成 我的右侧还有一列 用于手动添加上次
  • 如何将 PySpark 数据帧的每个非字符串列与浮点常量相除或相乘?

    我的输入数据框如下所示 from pyspark sql import SparkSession spark SparkSession builder appName Basics getOrCreate df spark createDa
  • Jhipster + REST 客户端 + 身份验证

    我需要了解如何验证 REST 客户端 可能是 Paw 可能是 Android 应用程序 使用 AFNetworking 和 jHipster 的 iOs 应用程序 我认为 更一般地说 使用 spring boot 我不是这方面的专家 虽然我
  • 使用 useEffect 更新 useReducer 'state'

    在我的应用程序中 我使用 React Hooks Context API 现在 每当我的 Provider 组件安装时 我都需要将从 localStorage 获取的数据分配给initialState carts state carts 如
  • 我可以将任意函数传递给 Scala 中的另一个函数吗?

    我是 Scala 的新手 能够将函数传递给其他函数非常巧妙 但是我可以传递一个随意的函数引用另一个函数 所述函数参数的数量将是固定的 也就是说 我也很好奇是否也可以传递具有任意数量的函数 我总是被类型错误绊倒 我尝试过使用Any但这似乎没有
  • 如何使用 iPhone 的 json 解析对象数组

    我在解析 JSON 结果中的对象数组时遇到问题 first name vijay last name last creditCardNumber 178978977779787979 month 02 year 2012 address A
  • 打开远程文档并保存回远程服务器

    我为我的办公室编写了一个在服务器上运行的网络应用程序 我们所有的文档也都在服务器上 我希望能够让用户通过我的网络应用程序浏览服务器上的文件夹 在编辑器 在线或桌面 中打开它 能够编辑它并将其保存回服务器的位置被打开 我一直在研究 Googl
  • Java:确定当前 Windows 用户的编程方式

    我看到很多类似的问题 但是我想使用 Java 查找当前登录用户的用户名 它可能是这样的 System getProperty current user 但是 我不太确定 你实际上非常接近 这就是您正在寻找的 System getProper
  • MemoryStream,无法访问关闭的流

    随着sharpPDF我生成一个 pdf 内存流 我想通过电子邮件直接发送它 但是 ms Seek 行给出了一个 ObjectDisposeException 无法访问关闭的流 pdf CreatePDF 方法采用 输出 文件名字符串或 输出
  • 如何为在 main() 外部和内部声明的变量分配内存

    我注意到 在处理一些大型数组 例如双倍 1000 x 1000 时 如果我在 main 内部声明数组 则我的程序会耗尽内存 但如果我在 main 外部声明数组 则这种情况似乎永远不会发生 即使是更大的阵列 有人可以解释一下区别是什么吗 当在
  • 如何同时更新结构体的多个字段?

    假设我有一个结构 struct Vector3 float x float y float z 注意sizeof Vector3 必须保持不变 编辑 我对没有设置器的解决方案感兴趣 我们不要创建该结构的实例Vector3 pos 我怎样才能
  • 如何从 tsv 文件中提取第一列?

    我有一个包含一些数据的文件 我想仅使用第一列作为我的脚本的标准输入 但我在提取它时遇到问题 我尝试使用这个 awk F t print 1 inputs tsv 但它只显示第一列的第一个字母 我尝试了其他一些操作 但它要么显示整个文件 要么
  • Python 3 C API 中的文件 I/O

    Python 3 0 中的 C API 已更改 弃用 文件对象的许多函数 之前 在 2 X 中 您可以使用 PyObject PyFile FromString char filename char mode 创建一个 Python 文件对
  • 循环遍历 Excel 工作表

    我有以下代码 我希望它在工作簿的其他 25 个工作表中运行 而不是重复代码 25 次 对于每个工作表 有没有办法让它循环 有人可以帮忙吗 Sub DeleteEmptyRows Dim ws As Worksheet Dim strSear
  • 如何在 selenium-webdriver 中获取窗口标题、id 和名称?

    我正在尝试实施以下方法硒网络驱动程序 ruby 获取所有窗口 ID 获取所有窗口标题 获取所有窗口名称 我运行 Selenium IDE 并将脚本导出到 Ruby Test Unit 将其另存为 rb 使用 Aptana Studio 3
  • 为什么 Delphi 说“无法解析单位名称 xxx”?

    我正在使用 Delphi2010 Enterprise Update 4 当我在 IDE 中打开项目并显示主窗体代码时 有2个单位名称用红色下划线表示 xxx http img268 imageshack us img268 6475 un
  • 如何将宽度设置为 50%

    我有一个水平方向的 LinearLayout 和 2 个 ImageView 我想让 ImagesView 填充屏幕宽度的 50 以便在不同尺寸的每部手机或平板电脑上工作 像这样的东西 50 50 迄今为止最好的
  • 从析构函数中调用虚函数

    这样安全吗 class Derived public PublicBase private PrivateBase Derived FunctionCall virtual void FunctionCall PrivateBase Fun