Skip to content

Conversation

@muyuuuu
Copy link
Contributor

@muyuuuu muyuuuu commented Sep 10, 2024

  1. 修复一个笔误
  2. 我深受 new,delete 和指针的毒害,增加一个例子

额外的,我忙里偷闲每天看一些 C++,可能后面还会以章节为单位提 PR (

@heheda123123
Copy link

1 goto不是为了这个原因发明的
2 本身c语言里面想要完全解决资源释放和错误处理,就必须用goto这种无条件跳转,不然是无法保证出错的时候资源还能正确释放

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

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

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处表达的其实是所有权的问题,简而言之所有权不明确。

谁是所有者?

务必明确表达出所有权。试想一下,你的程序是用传统 C++ 编写的,只能使用原始指针来表达指针、引用、std::unique_ptrstd::shared_ptr 这四种传参方式的所有权语义。

  • 传统 C++ 的关键问题是,谁是所有者?

下面的代码说明了我的观点:

void func(double* ptr){
  ...
}

double* ptr = new double[5];
func(ptr);

关键问题是,谁是资源的所有者?

是使用该数组的 func 中的被调用方,还是创建该数组的 func 的调用方?

如果 func 是所有者,那么它必须释放该资源。如果不是,则 func 不可以释放资源。

这种情况不能令人满意。如果 func 不释放资源,可能会发生内存泄露。如果 func 释放了资源,可能会导致未定义行为。

因此,所有权需要记录在文档中。使用现代 C++ 中的类型系统来定义所有权的契约是朝正确方向迈出的一大步,可以消除文档的模糊性。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

几十万行的代码会有几万个函数,用文档记录感觉不现实。。。

现代 C++ 中的类型系统来定义所有权的契约

我的知识盲区,去学习一下

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

用文档记录感觉不现实

这明显是在说迫不得已的不好的做法

谁是所有者?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

学习了 💯

@archibate archibate merged commit d159aa0 into parallel101:main Sep 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants