- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup、Herb Sutter 等顶尖 C++ 专家创建的一份 C++ 指南、规则及最佳实践。旨在帮助大家正确、高效地使用“现代 C++”.
这份指南侧重于接口、资源管理、内存管理、并发等 High-level 主题。遵循这些规则可以最大程度地保证静态类型安全,避免资源泄露及常见的错误,使得程序运行得更快、更好.
malloc()
/ free()
new
/ delete
[]
参数,用 span
替代 malloc()
/ free()
malloc() / free() 不支持构造、析构,不要和 new / delete 混用.
class Record {
int id;
string name;
};
void use()
{
// p1 可能是 nullptr;*p1 未初始化,尤其是其中的 name 不是一个合法的 string 对象
Record* p1 = static_cast<Record*>(malloc(sizeof(Record)));
// 除非抛异常,*p2 默认初始化
auto p2 = new Record;
// p3 可能是 nullptr;如果不为空,*p3 默认初始化
auto p3 = new(nothrow) Record;
delete p1; // error: 不能 delete 由 malloc() 返回的指针
free(p2); // error: 不能 free() new 出来的对象
}
最后的 delete、free 在有的实现中可能正常工作,有的会导致运行时错误.
有的应用中禁止异常,如 life-critical 和硬实时系统。但是很多针对异常的禁用只是迷信,或是担心导致旧代码资源管理上的混乱。如果是这种情况,可以考虑 nothrow 版本的 new 。
标记显式的 malloc/free 调用 。
new
/ delete
new 返回的指针应该属于资源句柄(在资源句柄的析构中自动调用 delete)。如果 new 返回值赋给了裸指针,可能导致资源泄露.
在大型项目中,如果在应用代码中(而不是在专门资源管理类中)出现 delete,那多半会有 bug:如果代码里有几处 delete 调用,你怎么保证没有多调用或者少调用?这类 bug 不一定能立即发现,可能在潜伏一段时间后,在某次代码维护/重构时暴露.
针对显式的 new / delete 给出警告,建议使用 make_unique 替代 。
否则,一旦抛异常或返回将导致资源泄露 。
void func(const string& name)
{
// 打开文件
FILE* f = fopen(name, "r");
vector<char> buf(1024);
// 关闭文件
auto _ = finally([f] { fclose(f); });
// ...
}
buf 分配空间可能失败抛异常,导致 f 文件句柄泄露 。
void func(const string& name)
{
ifstream f{name};
vector<char> buf(1024);
// ...
}
文件句柄在 ifstream 内部,ifstream 销毁时自动 fclose 文件句柄,简单、安全、高效.
标记那些用来初始化指针的显式资源分配 。
如果在一条语句中执行两个显式资源分配,可能导致资源泄露。因为很多子表达式的求值顺序(包括函数参数)是未定义的.
void fun(shared_ptr<Widget> sp1, shared_ptr<Widget> sp2);
如果像下面这样调用 fun() :
// BAD: 可能泄露
fun(shared_ptr<Widget>(new Widget(a, b)), shared_ptr<Widget>(new Widget(c, d)));
上述调用是“异常不安全”(exception-unsafe)的,因为编译器可能会对创建两个参数的表达式重新排序。特别是编译器可能交叉执行两个子表达式:先给 sp1、sp2 分配内存空间、然后调用 Widget 的构造。如果此时在构造某一个参数的时候抛出异常,则另一个对象的内存不会被释放! 。
解决这个问题也很简答,不在一条语句里出现多个显式资源分配即可。例如; 。
// 稍好,但有点乱
shared_ptr<Widget> sp1(new Widget(a, b));
fun(sp1, new Widget(c, d));
最好的办法是完全避免显式资源分配,而是通过工厂函数返回拥有的对象:
// 最佳实践
fun(make_shared<Widget>(a, b), make_shared<Widget>(c, d));
如果没有像 make_shared、make_unique 这样的工厂函数,自己封装一个.
如果一条语句内有多个显式资源分配,标记该语句 。
[]
参数,用 span
替代 数组形参退化为指针,丢失数组大小信息,容易导致边界错误。用 span 可以保留数组大小信息.
// 不推荐
void f(int[]);
// 不推荐指针指向多个对象
// 指针应该指向单个对象(见 R.2)
void f(int*);
// 推荐
void f(gsl::span<int>);
否则将导致混乱 。
class X {
void* operator new(size_t s);
void operator delete(void*);
};
如果希望内存不被释放,用 =delete 明确禁止释放操作.
标记不成对的分配/释放操作 。
最后此篇关于C++核心指南之资源管理(中)的文章就讲到这里了,如果你想了解更多关于C++核心指南之资源管理(中)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想让我的 NSIS 代码更具可读性。 我需要一些关于明智地编写代码部分的指南(比如 C# 中有 #region #endregion)或任何可以使编写 NSIS 代码变得有趣和容易的信息. 请帮帮我
我正在尝试找出Gherkin中所有可用的语法/格式,例如关于多行参数以及我不知道的所有其他内容。 在挖掘Google搜索结果之后,似乎综合指南位于here中: 我以为那很好,并且it链接到一个页面,该
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
当我将 guides 添加到 valueAxesSettings 中时,即使我选择 valueAxesSettings 到 valueAxes 中,它也不起作用。此外,valueAxesSetting
我正在寻找有关如何管理 .NET 程序集的三个不同程序集版本号的指针、建议,甚至是口述。 Product 版本是最简单的,因为这似乎通常由业务决定。然后,文件版本似乎用于部署之间的版本控制,其中实际的
昨晚我脑子里冒出一件事。我想知道为什么我们在项目之间仍然有不同的编码风格。由于风格是个人的东西,我认为最好这样对待它。我们为什么不呢?这有什么技术限制吗? 我举几个例子: // Code sample
我有一个应用程序,用户可以在其中从主 Activity 登录,然后可以使用 ListView 浏览实体的层次结构。因此,Activity 堆栈看起来像这样: A -> B -> B -> B -> .
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
大家好,上个月我开始学习 CSS。我做的第一件事是阅读我能在 www.w3school.com 上找到的所有内容,之后我开始阅读 CSS Mastery 2nd版本。我已经建立了几个自己的网站并取得了
我希望用户能够上传个人资料图片。 关于如何最好地处理这个问题,是否有任何指导方针?例如 - 在哪里保存图像?和要使用的文件夹结构。- 让用户难以浏览每个人的个人资料照片? 谢谢。 最佳答案 如果你自己
我有兴趣了解有关条件重启系统及其工作原理的更多信息。我不知道从哪里开始。我一直在查看源代码,但想知道是否有更高级别的指南可用。 最佳答案 Kent Pitman:条件系统 http://www.nhp
我想将小型、精简且平均的基于 C 的解析器合并到我的 Android 项目中。我过去做过 JNI 编程,但没有在 Android 上进行任何类型的 native (C) 开发。我的计划是将 C lib
免责声明:我试图搜索类似的问题,但是它返回了关于每个 C++ 问题的信息...此外,我将感谢任何可以提出更好标题的人。 C++ 中有两个著名的循环结构:while 和for。 我故意忽略了 do ..
我一直在尝试批量删除 Wordpress 帖子中的垃圾链接,如下所示: . 它们位于 post_content 列下的 wp_posts 表中。我试图通过在 href 标记中添加 % 的通配符来做到这
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
我们正在讨论为实体类定义方法的最佳方式 - 作为扩展方法或使用分部类。我们讨论的这类方法不会修改实体的状态,它们是纯粹的“辅助”方法,可以查询状态并返回值。 这两种方法的主要好处是保持实体类干净,同时
您将如何在 Flutter 中在实际屏幕上实现引导层。像这样: 最佳答案 这不是微不足道的。以下是必需的组件: 首先,你必须open a transparent full screen dialog
我们需要通过在 C/C++ 中实现特定算法来解决的大多数科学计算问题都需要远低于 double 的精度。例如,1e-6、1e-7 精度涵盖了 ODE 求解器或数值积分的 99% 情况。即使在我们确实需
我正在研究对专有 UI 框架(用于桌面应用程序)的 RTL 支持,我想知道:是否有关于如何更改小部件渲染的指南? 我正在寻找以下内容的列表: 复选框标签位于复选框左侧,右对齐 工具栏按钮从右到左排列
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!