File tree Expand file tree Collapse file tree 1 file changed +28
-1
lines changed Expand file tree Collapse file tree 1 file changed +28
-1
lines changed Original file line number Diff line number Diff line change @@ -203,7 +203,7 @@ some_c_function(foo.get());
203
203
204
204
> {{ icon.detail }} 在[错误处理专题](error_code.md)中有进一步的详解。
205
205
206
- 然而这有时我们会忘记在提前返回的分支中 delete 之前分配过的所有智能指针 。
206
+ 然而这有时我们会忘记在提前返回的分支中 delete 之前分配过的所有指向堆内存的指针 。
207
207
208
208
```cpp
209
209
int func() {
@@ -219,6 +219,33 @@ int func() {
219
219
}
220
220
```
221
221
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
+
222
249
而智能指针,不论是提前返回还是最终的返回,只要是函数结束了,都能自动释放。智能指针使得程序员写出“提前返回式”毫无精神压力,再也不用惦记着哪些需要释放。
223
250
224
251
``` cpp
You can’t perform that action at this time.
0 commit comments