使用new []

时间:2015-06-16 18:38:32

标签: c++ pointers dynamic new-operator allocation

我们的想法是加载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,并且我再也没有获得访问权限。但我的几何形状是看不见的。如果它是相机方向/位置的问题,我(有点)试过,并且它不是。我还检查了图形调试器,没有任何明显的问题。我之前遇到过这种看不见的几何问题,但之后它与光栅化器状态有关,这不是这里的情况。有没有人对在哪里寻找问题有一些建议?

1 个答案:

答案 0 :(得分:2)

是的!你绝对应该使用std::vector而不是new[]!它将为您完成所有内存管理,您可以使用std::vector::atplatforms debugging facilities进行范围检查访问。

这本身当然不会阻止访问违规行为,但它能够告诉您非常详细的信息(或者至少比new[]更精确的信息),例如:你试图访问什么索引以及数组实际有多大。

有了这些信息,找到根本问题通常比仅仅是一个相当无用的“分段错误”容易得多。

使用std::vector也会让你更难以犯一些(遗憾的是仍然常见的)错误,比如“免费使用”错误。