delete 真相曝光:原来 C++ 一直在“瞎删”
早年的 C 世界里,内存更像一张借条。你借走一块。还的时候只还一个地址。不写大小。听起来很离谱?当年大家还真就这么干了,而且干得挺理直气壮。那些年,free 从来不问“你借了多少”在最早的 C 里,m
阅读全文早年的 C 世界里,内存更像一张借条。你借走一块。还的时候只还一个地址。不写大小。听起来很离谱?当年大家还真就这么干了,而且干得挺理直气壮。那些年,free 从来不问“你借了多少”在最早的 C 里,m
阅读全文很多年前。我们想“废弃一个函数”。第一反应就是删掉。但你删一次。就会有人跑来敲你。“我升级了库,项目编不过了。”更要命的是。那时候很多库就是一堆头文件。接口发出去。就像把螺丝刀借给全公司。你收不回。所
阅读全文那会儿还没有 lambda。STL 刚进大家的工具箱。你第一次用上 std::sort 的时候。真的会觉得它很爽。然后它就问你一句。“按什么规则排?”你以为这问题很简单。结果你在代码库里多了一个新文件
阅读全文那会儿日志就是纯文本。也没人会说什么“结构化”。我们写日志。就是往文件里塞一行文本。然后靠 grep、awk、一点耐心。把问题捞出来。看起来粗糙。但真能救命。直到某一天。你想把“用户输入”也写进去。你
阅读全文那会儿还没有 C++14。很多人写 C++。说白了。就是在写 C。只是多了点 class。字符串也没变聪明。你眼里是“字符串”。它手里攥着的。常常只是一个地址。地址平时挺乖。你一拿它去做 +。它就开始
阅读全文那会儿 C++11 刚开始进项目。你第一次在代码里碰到 <type_traits>。不是在书上。是在发版前一晚。你本地一跑编译。它啪一下就挂了。报错里反复出现一个词。::type。你盯着它。像盯着一根
阅读全文那几年。C++11 刚出来。很多人第一次用上 lambda。感觉像突然不用再写那坨“函数对象”了。回调顺手。异步也顺手。大家写得很嗨。直到某天凌晨。线上啪一下。core dump。你第一反应是线程。第
阅读全文那会儿我们写 C/C++。配置常常就写在源码里。数字也就跟着一起写进去。一长串。一坨 0。你当时不会把它当风险。毕竟它“只是个常量”。直到有一天。你少写了一个 0。线上啪一下。服务开始挨打。你盯着那一
阅读全文你想“从函数里带回两个东西”。没有神兵利器。只有手工活。有人用引用。有人用指针。有人写一堆小结构体。还有人……开始写宏。你没听错。为了多返回值。真的有人写宏。当年没有 tuple 的日子那会儿还在 C
阅读全文那会儿还没有 C++11。我们写的东西更像 “C with classes”。也就是在 C 上面糊一层 class。项目不大。但麻烦一点都不少。尤其是日志。你总想写一个函数。什么都能塞进去。参数多少都
阅读全文很久以前。C++ 里想“用正则”,并不是一句 #include 就完事。你要么去翻 POSIX 的 regex.h。要么拉个 PCRE。要么用 Boost。然后开始跟编译选项、链接、版本兼容吵架。最尴
阅读全文很久以前。你写 C。你想要“随机”。你只有一个按钮。rand()。它来自 C 标准库。一开始也没打算让你拿它写抽奖、分流、风控。更多时候。是小游戏。是模拟。是“差不多就行”。然后我们就真的把它当成“随
阅读全文你写个小项目。代码不多。需求也不复杂。直到它上线。然后某天晚上。线上啪一下。你盯着日志发呆。崩在一个“回调”。你甚至没觉得自己写了什么高深东西。你只是。“想把一个能调用的东西传进去”。那些年,回调是怎
阅读全文那会儿你想要一张“用 key 快速查值”的表。标准库不给。只给你 std::map。要么你自己写一个。要么去翻各家编译器的私货。今天在你机器上能跑。明天换个编译器就报错。更惨的是。同事一更新工具链。线
阅读全文那会儿还没什么“智能指针”。你写的就是 C with classes。能跑就行。能上线就更行。资源这件事。基本靠自觉。new 之后。你得自己去把 delete 找回来。找不回来。就等着哪天线上给你脸色
阅读全文时间这东西。最喜欢伪装成“一个数字”。你看着它。觉得没啥。然后线上啪一下。很久以前。我们还没有那种“把单位写进类型里”的安全感。也没有一个统一的时间工具箱。时间就是 int。单位靠约定。约定靠注释。注
阅读全文如果你写过一点 C。你大概率相信过一句话。数组的长度。就在那对 [] 里。写着呢。不会丢。结果第一次做小项目上了线。啪。你会发现。长度不是“丢了”。是你从来没真正拥有过它。那是很早的年代。大家写的不是
阅读全文那会儿还没有 C++11。也没有 std::thread。更别提 std::async。你想并发。就去写 pthread。或者上 Boost。然后把“结果”塞回主线程。靠全局变量。靠输出参数。靠一堆锁
阅读全文在 C++11 之前。写 C++ 很像写 C。只不过多了个 class。那会儿没有 std::move。也没有右值引用这种东西。你想把一个对象传给别人。通常就一个动作。拷贝。对只写过 C 的人来说。拷
阅读全文我想先把时间拨回去。拨回到一个更野的年代。那会儿你也写模板。也会写一个 T。然后你盯着它发呆。这玩意到底是不是整数。能不能拷贝。是不是引用。是不是我想要的那个类型。你问得很认真。但编译器只回你一句。“
阅读全文那会儿还没有这些“把意图写进语法”的小工具。大家写的还是 C with classes。写着写着。项目就长大了。然后线上啪一下。你才发现。最贵的不是崩溃。是“它居然没按我想的跑”。那些年,覆写靠的是记
阅读全文那会儿你写一个“常量”。多半就是一行 #define。写上去。编译过。就当它永远不会变。直到有一天。它变了。而你是在凌晨两点才知道的。一个小项目,线上啪一下当年我们做过那种“小得不能再小”的服务。一个
阅读全文那会儿我们写 C。也写一点 C with classes。项目不大。胆子不小。我们总觉得。内存嘛。不就是一排字节。指针嘛。不就是一把钥匙。直到有一天。线上啪一下。不是逻辑错。是进程没了。还特别挑人。你
阅读全文有段时间。我们写程序。写着写着就会开始用线程。一个请求一个线程。或者一个线程池。那时候的痛点很朴素。我想要一个“全局变量”。但我只想让它对当前线程有效。别的线程别来碰瓷。那些年:没有“每线程一份全局”
阅读全文那是很多年前。办公室的灯。经常亮到半夜。我们写的 C++。其实就是 C。外加一点 class。那时候最响的一句话是。“能跑就行。”后来我才知道。有些东西。一旦“能跑”。就会跑去你没想到的地方。那会儿的
阅读全文十几年前。大家写 C。后来写 C with classes。代码里最常见的“类型”。就俩。int。double。数字一多。单位就开始飘。今天你写的是“500”。明天别人读成了“500”。然后线上啪一下
阅读全文那会儿我们写 C++。还是 “C with classes” 那味。项目不大。但线上一样会出事。出事的时候。你不会先怀疑字符串。你会先怀疑自己的人生选择。有一次半夜。线上突然开始找不到配置文件。日志里
阅读全文那会儿我们写 C++。很多人嘴上说 C++。手里其实还是 C。最多再加点 class。构造函数也一样。它看起来像“自动帮你把对象弄好”。但你真写过几天。就会发现它更像“手动装配流水线”。而且没有复用。
阅读全文你写下 p->foo()。看起来像一句话。像一句很普通的话。可在当年。这句话是很多人用 crash 堆出来的。而且那种 crash。通常还不在你写错的地方。“C++ makes it harder t
阅读全文那时候还没有“接口”这个词。大家写的更多是“约定”。写在邮件里。写在 README 里。写在某个老同事的脑子里。然后项目一大。约定就开始漏风。在没有纯虚函数的年代:大家怎么写“可扩展”的代码C 时代的
阅读全文