强制g ++零初始化内存

fok*_*oke 1 c++ g++

我想写一些我正在编写的库的单元测试

我有一个看起来像这样的课程:

class A
{
public:
    A(B* pB)
    // construction details, involves my library
    // but ultimately there is a new being done ,)

    B* m_pB;
};
Run Code Online (Sandbox Code Playgroud)

我想检查指针m_pB是否实际初始化,所以我沿着这些方向做了一些事情:

A* p = // creation of this object involves my library
BOOST_REQUIRE( p->m_pB != NULL );
Run Code Online (Sandbox Code Playgroud)

但它发生了g ++没有对内存进行零初始化,因此值p->m_pB只是随机的.当我new对象时,有没有办法强制g ++为我初始化这个内存?

我相信Visual Studio会根据特定代码执行类似的操作,具体取决于内存的分配位置.

编辑:我现在可以想到2个备份解决方案:使用智能指针,或编写新的运算符......

J T*_*J T 9

只需实现默认构造函数.这保证了在不传递参数的情况下,指针被初始化为NULL.

class A
{
public:
    A(B* pB)
    // construction details, involves my library
    // but ultimately there is a new being done ,)

    A() : m_pB(NULL) {}

    B* m_pB;
};
Run Code Online (Sandbox Code Playgroud)

或者Fritschy指出:

A() : m_pB() {}
Run Code Online (Sandbox Code Playgroud)

  • 它甚至可以*默认初始化成员. (5认同)

Pup*_*ppy 6

使用始终初始化的类.

template<typename T> class always_initialized {
    T t;
public:
    operator T&() { return t; }
    operator const T&() const { return t; }
    always_initialized() : t() {}
    always_initialized(const T& ref) : t(ref) {}
};
Run Code Online (Sandbox Code Playgroud)

编辑:我看到大多数人都不明白这实际上是做什么的.如果你只是将指针设置为NULL,那么你必须在每个构造函数中单独执行,然后你必须为每个变量再次执行它,并且它对于POD结构等其他POD事物也不是通用的.always_initialized更易于维护,因为它不会重复自己,更简洁,更通用,因为它对任何POD类型甚至非POD类型都有好处.

  • 嗯,我不认为这实际上有助于OP解决他们的问题 (2认同)