强制g++为零初始化内存

force g++ to zero initialize memory

本文关键字:初始化 内存 g++ 强制      更新时间:2023-10-16

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

我有一个类,它看起来像这样:

class A
{
public:
    A(B* pB)
    // construction details, involves my library
    // but ultimately there is a new being done ,)
    B* m_pB;
};
我想检查指针m_pB是否被初始化了,所以我做了以下几行:
A* p = // creation of this object involves my library
BOOST_REQUIRE( p->m_pB != NULL );

,但是g++没有对内存进行零初始化,所以p->m_pB的值只是随机的。当我new对象时,是否有一种方法可以强制g++为我零初始化这个内存?

我相信Visual Studio对特定的代码做了类似的事情,这取决于内存分配的位置。

编辑:我现在能想到两个备份方案:使用智能指针,或者写一个新的操作符…

简单地实现默认构造函数。这保证了在不传递实参的情况下,指针被初始化为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;
};

或者正如Fritschy指出的:

A() : m_pB() {}

使用一个总是初始化的类

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) {}
};
编辑:我发现大多数人都不明白这到底是做什么的。如果你只是将指针设为NULL,那么你必须在每个构造函数中单独这么做,然后你必须对每个变量都这样做,这对于POD结构等其他POD也不是通用的。always_initialized更易于维护,因为您不重复自己,更简洁,更通用,因为它适用于任何POD类型甚至非POD类型。

您是否考虑使m_pB私有并始终在您的构造函数中初始化它?通过使用封装来强制你的类不变量,你甚至不需要来做你在这里实现的检查。

感谢您的回答,但我想要一种侵入性较小的技术,因为类是测试的一部分,它们的构造函数正好在主题的中间,即依赖注入。

我只是想找一些类似于visual studio的东西,它可以通过g++或类似的选项在调试模式下将内存设置为某些特定值。

一些回答/评论基本上是说"不要测试,只要不要犯错误"

最后,我重载了new操作符并添加了对memset(ptr, 0, size);的调用我得到了我的critical check p->m_pB != __null failed,它工作得很好。

你们都得+1,尤其是DeadMg因为有趣的解