Skip to content

Commit 6843bff

Browse files
authored
Update no_more_new.md with some bad demo
1 parent e02029e commit 6843bff

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

docs/no_more_new.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ some_c_function(foo.get());
203203
204204
> {{ icon.detail }} 在[错误处理专题](error_code.md)中有进一步的详解。
205205
206-
然而这有时我们会忘记在提前返回的分支中 delete 之前分配过的所有智能指针
206+
然而这有时我们会忘记在提前返回的分支中 delete 之前分配过的所有指向堆内存的指针
207207
208208
```cpp
209209
int func() {
@@ -219,6 +219,33 @@ int func() {
219219
}
220220
```
221221

222+
这种现象并不少见,即使在一些头部大厂中,也会有 `new``delete` 成堆的代码,他们竟然使用 `goto` 语句来避免提前退出时忘记释放内存:
223+
224+
```cpp
225+
int func() {
226+
Foo *foo1 = new Foo();
227+
...
228+
Foo *foo2 = new Foo();
229+
...
230+
if (出错) {
231+
goto EXIT;
232+
}
233+
...
234+
EXIT:
235+
if (nullptr != foo1) {
236+
delete foo1;
237+
}
238+
if (nullptr != foo2) {
239+
delete foo2;
240+
}
241+
return 0;
242+
}
243+
```
244+
245+
这就会让编写程序的人精神紧绷,更加仔细的检查 `new``delete` 是否配对,`goto EXIT` 会不会有其他负面影响。享受不到编程的快乐就算了,反而在遭罪。。。
246+
247+
此外,`new``delete` 使用不配套时,也会导致严重的错误。由于 `new``delete` 是基于指针操作的,但是在很庞大的代码系统中我们拿到一个指针 `data *ptr` 后。这个 `ptr` 是空指针吗?还是已经被释放了吗?还是已经有内存了?还是交由我们申请内存?很容易忘记 `new` 而直接 `delete`,或者同对同一个指针 `new` 了两次,或者没有 `delete` 等等。看到屎山代码后的坏心情会导致代码维护难度指数级增加。
248+
222249
而智能指针,不论是提前返回还是最终的返回,只要是函数结束了,都能自动释放。智能指针使得程序员写出“提前返回式”毫无精神压力,再也不用惦记着哪些需要释放。
223250

224251
```cpp

0 commit comments

Comments
 (0)