Skip to content

Commit 0a5d190

Browse files
authored
Update no_more_new.md by review suggestion
1 parent 7b17812 commit 0a5d190

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

docs/no_more_new.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -219,13 +219,15 @@ int func() {
219219
}
220220
```
221221

222-
这种现象并不少见,即使在一些头部大厂中,也会有 `new``delete` 成堆的代码,他们竟然使用 `goto` 语句来避免提前退出时忘记释放内存
222+
过去,为了解决每个提前返回分支都需要 `delete` 之前分配所有资源的问题,人们使用 `goto` 大法拙劣地避免提前退出时忘记释放内存
223223

224224
```cpp
225225
int func() {
226-
Foo *foo1 = new Foo();
226+
Foo *foo1 = nullptr;
227+
Foo *foo2 = nullptr;
228+
foo1 = new Foo();
227229
...
228-
Foo *foo2 = new Foo();
230+
foo2 = new Foo();
229231
...
230232
if (出错) {
231233
goto EXIT;
@@ -244,7 +246,7 @@ EXIT:
244246

245247
这就会让编写程序的人精神紧绷,更加仔细的检查 `new``delete` 是否配对,`goto EXIT` 会不会有其他负面影响。享受不到编程的快乐就算了,反而在遭罪。。。
246248

247-
此外,`new``delete` 使用不配套时,也会导致严重的错误。由于 `new``delete` 是基于指针操作的,但是在很庞大的代码系统中我们拿到一个指针 `data *ptr` 后。这个 `ptr` 是空指针吗?还是已经被释放了吗?还是已经有内存了?还是交由我们申请内存?很容易忘记 `new` 而直接 `delete`或者同对同一个指针 `new` 了两次,或者没有 `delete` 等等。看到屎山代码后的坏心情会导致代码维护难度指数级增加。
249+
此外,`new``delete` 使用不配套时,也会导致严重的错误。由于 `new``delete` 是基于指针操作的,但是在很庞大的代码系统中我们拿到一个指针 `data *ptr` 后。这个 `ptr` 是空指针吗?还是已经被释放了吗?还是已经有内存了?还是交由我们申请内存?很容易忘记 `new` 而直接 `delete`或者对同一个指针 `new` 了两次,或者没有 `delete` 等等。看到屎山代码后的坏心情会导致代码维护难度指数级增加。
248250

249251
而智能指针,不论是提前返回还是最终的返回,只要是函数结束了,都能自动释放。智能指针使得程序员写出“提前返回式”毫无精神压力,再也不用惦记着哪些需要释放。
250252

0 commit comments

Comments
 (0)