函数作用域的静态非 Pod 对象初始化
Function Scoped Static Non Pod Object Initialization
我的印象是函数范围的非 Pod 结构被初始化了首次调用函数时。但是,在VS-2010上,如果构造函数抛出异常,则每次都会调用构造函数,直到构造成功为止。
此行为实现是特定于的还是标准保证的?
下面是演示行为的人为示例:
#include <iostream>
#include <string>
using namespace std;
//dummy resource class
class Resource {
public:
Resource() {
cerr<<"Allocate Resource "<<endl;
}
~Resource() {
cerr<<"Free Resource"<<endl;
}
};
//dummy class which will be statically instantiated
class Dummy {
public:
Dummy() {
cerr<<"in Dummy"<<endl;
throw(string("error"));
}
Resource res;
};
//main program
int main() {
for(int i = 0;i<3;i++) {
try {
//create a static object throw and exception
static Dummy foo;
}
catch ( std::string &e) {
cerr<<"Caught exception:"<<e<<endl<<endl;
}
}
return 1;
}
输出:
迭代次数:0
分配资源
静态对象构造函数
免费资源
捕获异常:错误
迭代次数:1
分配资源
静态对象构造函数
免费资源
捕获异常:错误
迭代次数:2
分配资源
静态对象构造函数
免费资源
捕获异常:错误**
我的印象是函数作用域的非 Pod 结构在第一次调用函数时被初始化。
当然,但是考虑一下"初始化"是什么意思 - 如果构造函数抛出,则对象不会初始化,因为没有对象。因此,下次遇到对象声明时,它将(尝试)再次初始化。
相关文章:
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- C++定义构造函数使对象成为非 POD
- 具有非 POD 对象的 GLib 异步队列
- 泛型运算符== 用于非 pod 对象
- 初始化新对象时C++默认构造函数和 POD 问题
- 通过指向其基的指针删除 POD 对象是否安全
- 为什么不能用memcpy复制非POD对象?
- 从数据成员(一次性嵌套类)中获取非 POD 对象的地址
- 使用static_cast铸造POD对象
- POD 类对象初始化是否需要构造函数
- 使用 memcpy 移动非 POD C++对象是否总是调用未定义行为
- C++不能传递非 POD 类型的对象
- 函数作用域的静态非 Pod 对象初始化
- 在共享库中全局声明的非pod对象的语义是什么?
- 从动态创建的数组构造pod对象时,是否推荐使用placement new ?
- 对于非pod对象,xvalue和右值在允许使用或行为方面的差异示例是什么?
- 为什么常量 POD 对象中的字段本身不是常量?
- 如何比较POD类型的对象
- C++标准是否允许对具有常量成员的 POD 对象进行零初始化
- 具有公共链接的非 POD 对象:应该发生什么?