gpt4 book ai didi

c++ - 访问Qt3DRender::QBuffer的数据时数据指针为

转载 作者:行者123 更新时间:2023-11-30 03:15:06 28 4
gpt4 key购买 nike

我有这样的陈述:

Qt3DRender::QAttribute *attribute = // ...

const float *posBufferPtr =
reinterpret_cast<const float *>(attribute->buffer()->data().constData());

一般来说,指针posBufferPtr是:

Normal pointer value

但是,有时指针值会变得奇怪:

Strange pointer value

我想知道<QArrayData::shared_null+24>是什么意思?我在问这个,因为当指针值很奇怪时,我的应用程序就会变得一团糟。

更新

我通过确保我的缓冲区包含数据来修复错误:

Qt3DRender::QGeometryRenderer *mesh = // ...

Qt3DRender::QGeometry *meshGeometry = mesh->geometry();

for (Qt3DRender::QAttribute *attribute : meshGeometry->attributes()) {
Qt3DRender::QBuffer *buf = attribute->buffer();
if (buf) {
// If buffer is empty, use data-generator to make data available
if (buf->data().isEmpty())
buf->setData(buf->dataGenerator()->operator()());
buf->setSyncData(true);
buf->setAccessType(Qt3DRender::QBuffer::AccessType::ReadWrite);
}
}

最佳答案

查看文件 $QTDIR/qtbase/src/corelib/tools/qarraydata.h ,我们看到了:

struct Q_CORE_EXPORT QArrayData
{
[...]

static const QArrayData shared_null[2];
static QArrayData *sharedNull() Q_DECL_NOTHROW { return const_cast<QArrayData*>(shared_null); }
}

...所以我们看到 QArrayData::shared_null 是一个静态/单例 QArrayData 对象(实际上它是其中两个的数组)。大概它被用作哨兵对象;即当另一个数据结构如 Qt3DRender::QBuffer没有可指向的有效 QArrayData 对象,而是指向 shared_null,作为表明该事实的一种方式。使用单例而不是 nullptr 在某些情况下很有用,因为这意味着他们的代码不必使用 if (buffer() != NULL) 来保护每个取消引用以避免在没有可用的有效 QArrayData 对象时崩溃。

至于 +24 部分,它表示您的指针距离 QArrayData::shared_null 对象开始的内存位置 24 字节。通过查看 qarraydata.h 中的代码,似乎 constData() 方法通过添加 qptrdiff 偏移值来计算要返回的指针指向它的 this 指针;所以大概在这种情况下偏移值设置为 24。但是,我认为返回的精确指针可能并不重要,因为 QArrayData::shared_null 对象在任何情况下都不太可能包含任何可用数据,即 data() 返回的长度可能为 0,因此不应取消引用指针。

我的建议是,在尝试使用 posBufferPtr 指针之前,您应该调用 attribute->buffer()->data().size() 并验证作为健全性检查,它足够大,可以用来做你想用它做的事情。即,如果您尝试将缓冲区用作 float 的数组,请使用 if (attribute->buffer()->data(). size() >= sizeof(float)*num_floats_I_expect_to_be_there) 或类似的。

关于c++ - 访问Qt3DRender::QBuffer的数据时数据指针为<QArrayData::shared_null+24>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310099/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com