STL真的不堪用吗???
2.5. 静态和全局变量
Tip
禁止使用 class 类型的静态或全局变量: 它们会导致很难发现的 bug 和不确定的构造和析构函数调用顺序.
静态生存周期的对象, 包括全局变量, 静态变量, 静态类成员变量, 以及函数静态变量, 都必须是原生数据类型 (POD : Plain Old Data): 只能是 int, char, float, 和 void, 以及 POD 类型的数组/结构体/指针. 永远不要使用函数返回值初始化静态变量; 不要在多线程代码中使用非 const 的静态变量.
不幸的是, 静态变量的构造函数, 析构函数以及初始化操作的调用顺序在 C++ 标准中未明确定义, 甚至每次编译构建都有可能会发生变化, 从而导致难以发现的 bug. 比如, 结束程序时, 某个静态变量已经被析构了, 但代码还在跑 – 其它线程很可能 – 试图访问该变量, 直接导致崩溃.
所以, 我们只允许 POD 类型的静态变量. 本条规则完全禁止 vector (使用 C 数组替代), string (使用 const char*), 及其它以任意方式包含或指向类实例的东东, 成为静态变量. 出于同样的理由, 我们不允许用函数返回值来初始化静态变量.
如果你确实需要一个 class` 类型的静态或全局变量, 可以考虑在 ``main() 函数或 pthread_once() 内初始化一个你永远不会回收的指针.
引用自google c++ style guide 中文版
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我勒个去!!!
用C++就是想隐藏底层繁琐,容易出错的字符串,指针操作。如果STL都不能用。。。![](https://www.wenjiangs.com/wp-content/uploads/chinaunix/202207/em29.gif)
![](https://www.wenjiangs.com/wp-content/uploads/chinaunix/202207/em29.gif)
标题跟内容怎么没关系?
谁不让我用 STL ,我就给他上 C# .
![](https://www.wenjiangs.com/wp-content/uploads/chinaunix/202207/luya.gif)
回复 4# hellioncu
本条规则完全禁止 vector (使用 C 数组替代), string (使用 const char*)
就像讨论 C VS C++ ?
lz完全理解偏了。
这个条款讨论的是 "static duration" 对象的初始化问题。
STL中的vector与string, 只是作为一个例子。
后面不是还有:
>> 及其它以任意方式包含或指向类实例的东东
要标题党, 也应该: class 真的不堪用吗?
回复 8# OwnWaterloo
谢谢赐教,真的是有点标题党。
我想了解的是,STL中string vector 的实现,是否决定了,他们不是线程安全的。在程序中使用会不会有什么问题。
回复 9# peijue
STL是一个规范, 这个规范没有要求容器必须在多线程下工作。
C++03本来就避免定义线程方面的东西。
据说gcc使用的STL实现 —— sgi stl —— 是支持多线程访问的。
我是彻底不能理解将容器与线程安全扯到一起有什么好处。
不扯远了。
这个条款真的不是仅仅在说"容器"的问题, 而是那些static对象的初始化以及析构的问题。
只是STL容器恰好都不是POD, 而且又广为(C++程序员)人知, 所以用来作为例子。