File tree 1 file changed +6
-4
lines changed
1 file changed +6
-4
lines changed Original file line number Diff line number Diff line change @@ -219,13 +219,15 @@ int func() {
219
219
}
220
220
```
221
221
222
- 这种现象并不少见,即使在一些头部大厂中,也会有 ` new ` 和 ` delete ` 成堆的代码,他们竟然使用 ` goto ` 语句来避免提前退出时忘记释放内存 :
222
+ 过去,为了解决每个提前返回分支都需要 ` delete ` 之前分配所有资源的问题,人们使用 ` goto ` 大法拙劣地避免提前退出时忘记释放内存 :
223
223
224
224
``` cpp
225
225
int func () {
226
- Foo *foo1 = new Foo();
226
+ Foo *foo1 = nullptr;
227
+ Foo *foo2 = nullptr;
228
+ foo1 = new Foo();
227
229
...
228
- Foo * foo2 = new Foo();
230
+ foo2 = new Foo();
229
231
...
230
232
if (出错) {
231
233
goto EXIT;
@@ -244,7 +246,7 @@ EXIT:
244
246
245
247
这就会让编写程序的人精神紧绷,更加仔细的检查 ` new ` 和 ` delete ` 是否配对,` goto EXIT ` 会不会有其他负面影响。享受不到编程的快乐就算了,反而在遭罪。。。
246
248
247
- 此外,` new ` 和 ` delete ` 使用不配套时,也会导致严重的错误。由于 ` new ` 和 ` delete ` 是基于指针操作的,但是在很庞大的代码系统中我们拿到一个指针 ` data *ptr ` 后。这个 ` ptr ` 是空指针吗?还是已经被释放了吗?还是已经有内存了?还是交由我们申请内存?很容易忘记 ` new ` 而直接 ` delete ` ,或者同对同一个指针 ` new ` 了两次,或者没有 ` delete ` 等等。看到屎山代码后的坏心情会导致代码维护难度指数级增加。
249
+ 此外,` new ` 和 ` delete ` 使用不配套时,也会导致严重的错误。由于 ` new ` 和 ` delete ` 是基于指针操作的,但是在很庞大的代码系统中我们拿到一个指针 ` data *ptr ` 后。这个 ` ptr ` 是空指针吗?还是已经被释放了吗?还是已经有内存了?还是交由我们申请内存?很容易忘记 ` new ` 而直接 ` delete ` ,或者对同一个指针 ` new ` 了两次,或者没有 ` delete ` 等等。看到屎山代码后的坏心情会导致代码维护难度指数级增加。
248
250
249
251
而智能指针,不论是提前返回还是最终的返回,只要是函数结束了,都能自动释放。智能指针使得程序员写出“提前返回式”毫无精神压力,再也不用惦记着哪些需要释放。
250
252
You can’t perform that action at this time.
0 commit comments