请问有没有好用的跨平台的C和C++的内存泄漏检测工具?

对 Go 语言评价的人是非常多的,在基于自己多编程语言设计和思考的理解外,也可以多看看其他人是怎么想的,有助于多角度的认知。

今天给大家分享的是日常争议很大的王垠所写的《对 Go 语言的综合评价[1]》,看看能不能得到些什么。

以下为原文,内容仅代表王垠本人的评价,不代表煎鱼也一定认同。内容有所修整、格式、排版。篇幅比较长,建议收藏,预留时间阅读。

以前写过一些对 Go 语言的负面评价。现在看来,虽然那些评价大部分属实,然而却由于言辞激烈,没有点明具体问题,难以让某些人信服。

在经过几个月实际使用 Go 来构造网站之后,我觉得现在是时候对它作一些更加 “客观” 的评价了。

Go 比起 C 和 C++ 确实有它的优点,这是很显然的事情。它比起 Java 也有少数优点,然而相对而言更多是不足之处。所以我对 Go 的偏好在比 Java 稍低一点的位置。

Go 语言比起 C,C++ 的强项,当然是它的简单性和垃圾回收。由于 C 和 C++ 的设计有很多历史遗留问题,所以 Go 看起来确实更加优雅和简单。比起那些大量使用设计模式的 Java 代码,Go 语言的代码也似乎更简单一些。另外,Go 的垃圾回收机制比起 C 和 C++ 的全手动内存管理来说,大大降低了程序员的头脑负担。

但是请注意,这里的所谓 “优点” 都是相对于 C 之类的语言而言的。如果比起另外的一些语言,Go 的这种优点也许就很微不足道,甚至是历史的倒退了。

Go 的简单性体现在它的语法和语义的某些方面。Go 的语法比 C 要稍好一些,有少数比 Java 更加方便的设计,然而却也有“倒退”的地方。

而且这些倒退还不被很多人认为是倒退,反而认为是进步。我现在举出暂时能想得起来的几个方面。

以下内容分为进步和倒退两个方面来讲述。

Go 有语法支持一种类似 struct literal 的构造,比如你可以写这样的代码来构造一个 S struct:

这比起 Java 只能用构造函数来创建对象是一个不错的方便性上的改进。这些东西可能借鉴于 等语言的设计。

类型放在变量后面,却没有分隔符。如果变量和它的类型写成像 Pascal 那样的,比如 x : int,那也许还好。然而 Go 的写法却是 x int,没有那个冒号,而且允许使用 x, y int 这样的写法。

这种语法跟 var,函数参数组合在一起之后,就产生了扰乱视线的效果。比如你可以写一个函数是这样开头的:

注意 x, y, z 那个位置,其实是很混淆的。因为看见 x 的时候我不能立即从后面那个符号(, y)看到它是什么类型。

所以在 Go 里面我推荐的写法是把 x 和 y 完全分开,就像 C 和 Java 那样,不过类型写在后面:

这样一来就比较清晰了,虽然我愿意再多写一些冒号。每一个参数都是“名字 类型”的格式,所以我一眼就看到 x 是 int。虽然多打几个字,然而节省的是“眼球 parse 代码”的开销。

类型语法。Go 使用像 []string 这样的语法来表示类型。很多人说这种语法非常“一致”,但经过一段时间我却没有发现他们所谓的一致性在哪里。

这样的语法很难读,因为类型的各部分之间没有明确的分隔标识符,如果和其他一些符号,比如 * 搭配在一起,你就需要知道一些优先级规则,然后费比较大的功夫去做“眼球 parse”。

比如,在 Go 代码里你经常看到 []*Struct 这样的类型,注意 *Struct 要先结合在一起,再作为 [] 的“类型参数”。这种语法缺乏足够的分隔符作为阅读的“边界信号”,一旦后面的类型变得复杂,就很难阅读了。

内存泄漏一直是 C++ 中比较令人头大的问题, 即便是很有经验的 C++程序员有时候也难免因为疏忽而写出导致内存泄漏的代码。除了基本的申请过的内存未释放外,还存在诸如异常分支导致的内存泄漏等等。本项目将使用 C++ 实现一个内存泄漏检查器。

十分巧妙的设计,通过重载new和delete操作符来判断是否发生内存泄漏,学到了

06:55:55 来自:内存泄露检查器的设计与实现

如何保证头文件里的静态变量是最后析构的? 如果待检测的工程文件中的全局类的析构的时机晚于它 岂不是就是检测不到了

16:23:39 来自:内存泄露检查器的设计与实现

你说得有道理,但这种方式也并不是彻底没有价值。有时候我们可能期望对某个代码单元进行测试,这时候把相关逻辑独立出来再进行检查,也算作是积累代码优化工作流的一种方式。进而我们甚至可以继续优化这个检查器,继续降低其对代码的侵入性,向更完善的框架靠拢。

还可以,不过并没有什么卵用,为什么要重装new,而不用内置的,技术含量不是很大,为了实现内存泄露检查而设计,没有实用价值

11:26:11 来自:内存泄露检查器的设计与实现

这是因为在头文件中的静态变量会被多次定义,每包含一次,都会在某个 .cpp 中被定义(这里则在 main.cpp 和 test.cpp 中均有定义),但实际上他们均为同名,本质上还是同一个对象。

22:29:27 来自:内存泄露检查器的设计与实现

17:25:21 来自:内存泄露检查器的设计与实现

01:34:00 来自:内存泄露检查器的设计与实现

17:02:14 来自:内存泄露检查器的设计与实现

14:21:30 来自:内存泄露检查器的设计与实现

00:18:36 来自:内存泄露检查器的设计与实现

15:38:27 来自:内存泄露检查器的设计与实现

我要回帖

更多关于 7001端口漏洞 的文章

 

随机推荐