假设你有一个C ++类Foo,你说:
Foo* foos = new Foo[SOME_CONSTANT];
memset(foos, 0, sizeof(Foo)*SOME_CONSTANT);
//or the bzero equivalent
并且Foo有一个数据成员Bar* barPtr
。将上述操作保证
barPtr会是NULL吗? (即零)。我在gdb中遇到了一个案例,这个案例不适用于memset,我很好奇为什么。
我知道以上可能是不好的做法,但我要求好奇心。
我意识到我有一个额外的,我在memset中做了sizeof(Foo )* SOME_CONSTANT ......
答案 0 :(得分:3)
没有。空指针的表示不需要都是零位。
答案 1 :(得分:3)
一方面,它是实现定义的。 memset
或bzero
将使用全零位模式填充指针值,这不能保证在给定平台上是空指针的物理表示。它甚至不能保证生成有效的指针值,这意味着您最终可能会遇到所谓的陷阱表示,这会在访问时触发未定义的行为。
另一方面,bzero
是(或曾经是)POSIX规范的一部分。如果内存服务,POSIX需要(或至少用于要求)空指针由全零位模式表示,这意味着在POSIX系统上它确实将指针设置为null。
但同样,POSIX给出的保证只是我答案第一部分提到的特定于实现的属性的一个例子。语言(C或C ++)没有提供这样的保证。