webkit中对incomplete type指针的处理技巧

近日在研究webkit的时候发现了一个函数

template<typename T> inline void deleteOwnedPtr(T* ptr)
{typedef char known[sizeof(T) ? 1 : -1];if(sizeof(known))delete ptr;
}

一开始对这个函数非常费解,为什么作者不直接

delete ptr;

 

通过上stackoverflow提问然后查阅了一些资料后终于得到结果:这是用来防范错误释放incomplete type指针而导致的未知的行为。这样做之后,释放incomplete type指针将引发一个编译错误,使可能的错误能够及早发现。

原文是:If we delete a pointer and the object has incomplete type, we get undefined behavior. Instead this code causes compilation to fail if the object has incomplete type. The use of a negative number for the size of an array is a way to guarantee we get a compilation error.

 

那么什么是incomplete type呢?顾名思义,就是一个只有声明没有定义完成的类型,比如前向声明。

举个例子

class SomeType;void SomeFunction(SomeType* ptr)
{deleteOwnedPtr(ptr);
}

SomeType就是一个incomplete type,我们并不知道他的定义,如果我们企图释放该类型的指针,可能产生错误。

为了尽早避免出现这样的错误,我们先判断该指针指向的类型是否是incomplete type,然后人为引发一个编译期错误。

所以当ptr指向imcomplete type时,sizeof(T)结果为零,这时语句变为

typedef char[-1] known;
if (sizeof(known))
{...
}

由于数组的大小不能为负,所以引发了编译错误,我们就能及早的发现可能出现的问题。

 

参考链接

http://stackoverflow.com/questions/10897998/i-cant-understand-the-deleteownedptr-function-in-webkit

转载于:https://www.cnblogs.com/Jiajun/archive/2012/11/15/2772072.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 1004. 最大连续1的个数 III(滑动窗口)

给定一个由若干 0 和 1 组成的数组 A&#xff0c;我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长&#xff08;连续&#xff09;子数组的长度。 示例 1&#xff1a; 输入&#xff1a;A [1,1,1,0,0,0,1,1,1,1,0], K 2 输出&#xff1a;6 解释&#xff1a; [1,1,1…

我如何找到工作并找到理想的工作

By Julius Zerwick朱利叶斯泽威克(Julius Zerwick) This article is about how I went through my job hunt for a full time position as a software engineer in New York City and ended up with my dream job. I had spent two years building my skills and had aspirati…

synchronized 与 Lock 的那点事

synchronized 与 Lock 的那点事 最近在做一个监控系统&#xff0c;该系统主要包括对数据实时分析和存储两个部分&#xff0c;由于并发量比较高&#xff0c;所以不可避免的使用到了一些并发的知识。为了实现这些要求&#xff0c;后台使用一个队列作为缓存&#xff0c;对于请求只…

ols线性回归_普通最小二乘[OLS]方法使用于机器学习的简单线性回归变得容易

ols线性回归Hello Everyone!大家好&#xff01; I am super excited to be writing another article after a long time since my previous article was published.自从上一篇文章发表很长时间以来&#xff0c;我很高兴能写另一篇文章。 A Simple Linear Regression [SLR] is…

ubuntu安装配置jdk

先去 Oracle下载Linux下的JDK压缩包&#xff0c;我下载的是jdk-7u4-linux-i586.tar.gz文件&#xff0c;下好后直接解压Step1:# 将解压好的jdk1.7.0_04文件夹用最高权限复制到/usr/lib/jvm目录里sudo cp -r ~/jdk1.7.0_04/ /usr/lib/jvm/Step2:# 配置环境变量sudo gedit ~/.prof…

leetcode 697. 数组的度(hashmap)

给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1&#xff1a; 输入&#xff1a;[1, 2, 2, 3, 1] 输出&…

facebook机器学习_如何为您的页面创建Facebook Messenger机器人

facebook机器学习by Paul Pinard保罗皮纳德(Paul Pinard) 如何为您的页面创建Facebook Messenger机器人 (How to create a Facebook messenger bot for your page) When it comes to sharing your chatbot, Facebook Messenger is a must. We created a very easy step-by-ste…

Logstash配置语法及相关命令

配置结构以及插件位置 输入插件&#xff1a; input{ … } 过滤插件&#xff1a; filter{ … } 输出插件&#xff1a; output{ … } 数据类型 - Array users > [{id > 1,name > N1},{id > 2,name > N2}] - lists path > ["/var/log/messages"…

面试整理

SpringMVC 和Struts2的区别 1. 机制&#xff1a; spring mvc的入口是servlet&#xff0c;而struts2是filter&#xff0c;这样就导致了二者的机制不同。 2. 性能&#xff1a; spring会稍微比struts快。spring mvc是基于方法的设计&#xff0c;而sturts 是基于类&#xff0c;…

Amazon Personalize:帮助释放精益数字业务的高级推荐解决方案的功能

By Gerd Wittchen盖德维琴 推荐解决方案的动机 (Motivation for recommendation solutions) Rapid changes in customer behaviour requires businesses to adapt at an ever increasing pace. The recent changes to our work and personal life has forced entire nations t…

Linux 链接文件讲解

链接文件是Linux文件系统的一个优势。如需要在系统上维护同一文件的两份或者多份副本&#xff0c;除了保存多份单独的物理文件之外&#xff0c;可以采用保留一份物理文件副本和多个虚拟副本的方式&#xff0c;这种虚拟的副本就成为链接。链接是目录中指向文件真实位置的占位符。…

系统滚动条实现的NUD控件Unusable版

昨天研究了一下系统滚动条&#xff0c;准备使用它来实现一个NumericUpDown控件&#xff0c;因为它可以带来最正宗的微调按钮外观&#xff0c;并说了一下可以使用viewport里的onScroll事件来获取系统滚动条的上下点击动作。 同时昨天还说了onScroll事件的一个问题是&#xf…

react 中渲染html_如何在React中识别和解决浪费的渲染

react 中渲染htmlby Nayeem Reza通过Nayeem Reza 如何在React中识别和解决浪费的渲染 (How to identify and resolve wasted renders in React) So, recently I was thinking about performance profiling of a react app that I was working on, and suddenly thought to set…

php变量的数据类型

一、类型 标量类型: 布尔型 整型 浮点型 字符串 复合类型: 数组 对象 特殊类型: 资源 null 1. 布尔型 true false 以下值认为是false 其他值都认为是true; 布尔值false 整型值0 浮点的0 空字符串和字符串0 空数组 空对象(只适用于php4) 特殊类型null 2. 整型 正整数和负整…

[习题].FindControl()方法 与 PlaceHolder控件 #2(动态加入「子控件」的事件)

这是我的文章备份&#xff0c;有空请到我的网站走走&#xff0c; http://www.dotblogs.com.tw/mis2000lab/ 才能掌握我提供的第一手信息&#xff0c;谢谢您。 http://www.dotblogs.com.tw/mis2000lab/archive/2011/07/26/placeholder_findcontrol_eventhandler.aspx [习题].Fi…

西雅图治安_数据科学家对西雅图住宿业务的分析

西雅图治安介绍 (Introduction) Airbnb provides an online platform for hosts to accommodate guests with short-term lodging. Guests can search for lodging using filters such as lodging type, dates, location, and price, and can search for specific types of hom…

leetcode 1438. 绝对差不超过限制的最长连续子数组(滑动窗口+treemap)

给你一个整数数组 nums &#xff0c;和一个表示限制的整数 limit&#xff0c;请你返回最长连续子数组的长度&#xff0c;该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。 如果不存在满足条件的子数组&#xff0c;则返回 0 。 示例 1&#xff1a; 输入&#…

react-redux图解_如何将React连接到Redux —图解指南

react-redux图解by Princiya由Princiya 如何将React连接到Redux —图解指南 (How to connect React to Redux — a diagrammatic guide) This post is aimed at people who already know React and Redux. This will aid them in better understanding how things work under …

几种机器学习算法的优缺点

1决策树&#xff08;Decision Trees&#xff09;的优缺点 决策树的优点&#xff1a; 一、 决策树易于理解和解释.人们在通过解释后都有能力去理解决策树所表达的意义。 二、 对于决策树&#xff0c;数据的准备往往是简单或者是不必要的.不需要预处理数据。…

【贪心】买卖股票的最佳时机含手续费

/** 贪心&#xff1a;每次选取更低的价格买入&#xff0c;遇到高于买入的价格就出售(此时不一定是最大收益)。* 使用buy表示买入股票的价格和手续费的和。遍历数组&#xff0c;如果后面的股票价格加上手续费* 小于buy&#xff0c;说明有更低的买入价格更新buy。如…