我们的想法是加载Wavefront OBJ文件并使用DirectX 11.0进行渲染。到目前为止,一切都有效,除了实际加载几何外。
我为浮点数分配了一个指针数组,以包含我的顶点位置,纹理坐标和法线:
pfVertices_ = new float[nTotalVertices_ * 3];
pfNormals_ = new float[nTotalVertices_ * 3];
pfTexcoords_ = new float[nTotalVertices_ * 2];
我释放它们,当然:
delete[] pfVertices_;
delete[] pfNormals_;
delete[] pfTexcoords_;
当我尝试加载包含大约9200个顶点的模型时,我遇到了访问冲突。我明白问题是什么,我只是不知道如何解决它。我已经尝试了malloc()
和free()
,但是AFAIK你无法在void*
内投放float*
而不会遇到麻烦,它仍然会让我访问冲突。
所以,我的问题:
有没有一种动态分配大型数组的安全方法,还是我应该忍受new
的缺点?
编辑:所以是的,我知道std::vector
从一开始就存在。我因为一些糟糕的经历而避开它,因为当GPU上的图形引擎变得沉重时,我担心它的性能。
无论如何,我将所有内容都转换为std::vector
,并且我再也没有获得访问权限。但我的几何形状是看不见的。如果它是相机方向/位置的问题,我(有点)试过,并且它不是。我还检查了图形调试器,没有任何明显的问题。我之前遇到过这种看不见的几何问题,但之后它与光栅化器状态有关,这不是这里的情况。有没有人对在哪里寻找问题有一些建议?
答案 0 :(得分:2)
是的!你绝对应该使用std::vector
而不是new[]
!它将为您完成所有内存管理,您可以使用std::vector::at
或platforms debugging facilities进行范围检查访问。
这本身当然不会阻止访问违规行为,但它能够告诉您非常详细的信息(或者至少比new[]
更精确的信息),例如:你试图访问什么索引以及数组实际有多大。
有了这些信息,找到根本问题通常比仅仅是一个相当无用的“分段错误”容易得多。
使用std::vector
也会让你更难以犯一些(遗憾的是仍然常见的)错误,比如“免费使用”错误。