我想在空间上对一些树节点进行分区,但是在调试时会在断点处从 0xcccccccccccccccc 接收到std::partition指针值。有人知道这意味着什么吗?

template <typename NodeData> struct PartitionPredicate {
    PartitionPredicate(float s, uint32_t a) : splitPos(s), splitAxis(a) {}
    float splitPos;
    uint32_t splitAxis;

    bool operator()(const NodeData *data) const {
        return data->p[splitAxis] <= splitPos;
    }
};

...
const NodeData **m = std::partition(&buildNodes[start], &buildNodes[end], PartitionPredicate<NodeData>(splitPos, splitAxis));
uint32_t mid = start + (m - &buildNodes[start]);
// buildNodes is of type const NodeData **
...

值:start=0end=407838(buildNodes vector 的大小)
m = 0xcccccccccccccccc
mid > 3000000000

我将startendmid的类型更改为uint32_t而不是int,因为我收到了mid很大的负值,但是m可以接受。

编辑:我将断点放置得太早了。返回的指针是未知的,Visual Studio似乎根据它们自己的默认初始化来预先计算所有附近的值。
buildNodes位于0x00000000050c0070m位于0x0000000005161c58
所以中= 82616->确定

最佳答案

m尚未初始化-尚无有效值。 0xcccccccccccccccc的实际值是系统用来填充内存的内容,以便可以检测未初始化的变量。专门选择此值是为了使其不是“有效的内存地址”-这样,您就不会偶然或故意使用未初始化变量的内存而不会出现某种错误或陷阱。

08-16 11:36