类树的一个分支怎么能让它的所有 Zero 初始化成员都是垃圾
How can one branch of class tree have all its Zero initialized members be rubbish?
(只有当零初始化为静态作用域成员时才不是垃圾),它在GCC上按预期工作!((
因此,对于以下代码:
#include <iostream>
#include <boost/shared_ptr.hpp>
namespace SP
{
// enums
enum EnumMessage {
EnumMessage_EventBase = 0,
EnumMessage_EventServiceBase = 1,
EnumMessage_OperationBase = 2
};
class Message;
// define proxy class
class Message {
public:
EnumMessage _MessageCode;
};
class Parent : public Message {
public:
int _ServiceId;
int _CallbackId;
};
class Child : public Parent {
public:
std::string _Debug;
};
class AnotherChild : public Parent {
public:
int _UserId;
};
}
using namespace SP;
int main() {
//OK
static Child staticScopeChild = Child();
boost::shared_ptr<Parent> ptrParent(new Parent());
boost::shared_ptr<AnotherChild> ptrChild2(new AnotherChild());
//Bad
Child scopeChild = Child();
boost::shared_ptr<Child> ptrChild(new Child());
std::cout << "static " << staticScopeChild._MessageCode
<< std::endl << "vs scope " << scopeChild._MessageCode
<< std::endl << "vs pointer " << ptrChild->_MessageCode
<< std::endl << "vs parent class pointer: " << ptrParent->_MessageCode
<< std::endl << "vs another parent child: " << ptrChild2->_MessageCode <<std::endl;
std::cin.get();
return 0;
}
其中所有类通常是 POD(ints
、enums
)我得到下一个输出:
static 0
vs scope -858993460
vs pointer -842150451
vs parent class pointer: 0
vs another parent child: 0
而我期望一切都0
!
为什么会发生这样的事情?
这似乎是一个编译器错误:根据这份报告,基类的成员在派生类的值初始化期间没有零初始化。
据我所知,您的代码没有任何问题,所有类成员都应该在符合 C++03 或 C++11 编译器上零初始化。
我想你的选择是:
- 通过避免继承使类更像 POD;或者
- 将默认构造函数添加到任何基类以显式零初始化所有成员;或
- 使用损坏较少的编译器。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 如何生成代码以自定义零值以t :: Zero的形式初始化具有自定义零值的std :: vector
- 将模板化类型初始化为"zero"
- 类树的一个分支怎么能让它的所有 Zero 初始化成员都是垃圾