假设你有一个 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...
最佳答案
一方面,它是实现定义的。 memset
或 bzero
将用全零位模式填充指针值,这不能保证是给定平台上空指针的物理表示。它甚至不能保证产生有效的指针值,这意味着您最终可能会得到所谓的陷阱表示,这会在访问时触发未定义的行为。
另一方面,bzero
是(或曾经是)POSIX 规范的一部分。如果内存可用,POSIX 要求(或至少过去要求)空指针由全零位模式表示,这意味着在 POSIX 系统上它确实会将指针设置为空。
但是,POSIX 给出的保证只是我回答第一部分中提到的特定于实现的属性的一个示例。语言(C 或 C++)不提供此类保证。
关于c++ - memset 或 bzero 是否保证结构中的字段指针将被清零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13187570/