强制g++为零初始化内存
force g++ to zero initialize memory
我想为我正在编写的库编写一些单元测试
我有一个类,它看起来像这样:
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因为有趣的解
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 如何在 malloc 内存中初始化非 POD 数据
- 犰狳C++ - 从常量内存初始化只读矩阵而不复制
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 获取有关使用未初始化内存的错误代码
- 取消初始化内存区域
- 如何使用构造函数初始化内存地址(指针变量)?
- 哪一种是在C 中分配非初始化内存的最惯用方法
- 用C++中的nan初始化内存进行调试
- 如何最好地处理具有未初始化内存的复制交换习惯用法
- 多少新的初始化内存到对象
- 在c++中不初始化内存而分配内存
- vector成员变量是否可以未初始化(内存错误)
- 用幻数初始化内存块的简明方法
- 使用已定义结构体的vector到达未初始化内存
- 用于调试的未初始化内存的常用值是什么?
- 强制g++为零初始化内存