1

次のコード行があります。

boneHierarchy = BoneHierarchy(Point3D(24.5f,
                                       84.0f + HumanBoundingBox::HEIGHT/2.0f ,24.5f
                                      ),
                              CompassRadians(0.0f),
                              renderingEngine
                             );

BoneHierarchy には、プライベート メンバーとしていくつかのベクトルがあります。ベクターのアドレスを取得し、レンダリング クラスに渡します。しかし、ベクトルのサイズメンバー関数を呼び出すと、ガベージが発生します。その中の要素ではなく、ベクトルのアドレスを取得しています。

BoneHierarchy::BoneHierarchy(Point3D const& position,
                             CompassRadians const& heading,
                             Renderer* renderingEngine) : counter(0), renderingEngine(renderingEngine)
{    




    CoordinateSystem bodyCoordSys = CoordinateSystem(
                                                     Vector3D(0.0f,1.0f,0.0f),
                                                     Vector3D(0.0f,0.0f,1.0f));


    map<Normal3D::enumeration, TextureCoordinates> cubeTextureKind;
    Normal3D::enumeration normal;
    for (normal = Normal3D::begin(); normal != Normal3D::end(); ++normal)
    {
        cubeTextureKind[normal] = TextureAtlas::textureAtlasCoordLookup(WOOD);
    }
    Bone body = Bone(
                     Vector3D(0.0f, HumanBoundingBox::HEIGHT/2.0f,0.0f),
                     HumanBoundingBox::DIM,
                     Euler3D(0.0f,0.0f,0.0f),
                     cubeTextureKind,
                     bodyCoordSys);
    //TODO there are two positions for the human, one here and one in mesh vbo, unify these into one.
    body.setPosition(Vector3D(position.getX(),position.getY(),position.getZ()));
    body.setEuler(Euler3D((float) (Math::toDegrees(heading.getValue())),0.0f,0.0f));
    drawBone(body,UPDATE_ALL);
    root = body;


    map<string,Renderer::Buffer> vboVariableMap;
    vboVariableMap["aVertexPosition"] = Renderer::Buffer(verticesBuf);
    vboVariableMap["aTextureCoord"] = Renderer::Buffer(texCoordsBuf);
    vboVariableMap["index"] = Renderer::Buffer(indicesBuf);
    cout << "aBoneIndex " << boneIndexBuf.size() << endl;
    vboVariableMap["aBoneIndex"] = Renderer::Buffer(boneIndexBuf);
    vboVariableMap["uBoneMatrix0"] = Renderer::Buffer(transformMatrixBuf);
    GLuint textureID = 0; 
    Renderer::VBODescription vboDescription = Renderer::VBODescription("boneShader",
                                                                       vboVariableMap,
                                                                       GL_DYNAMIC_DRAW,
                                                                       indicesBuf.size(),
                                                                       textureID);
    bufferID = renderingEngine->registerBuffer(vboDescription);
    cout << "bufferID " << bufferID << endl;
    renderingEngine->printBoneIndexSize();
    cout << &(getBoneIndexBuf()) << endl;
}


Renderer::Buffer::Buffer(vector<GLfloat> const& data):
floatData(&data), ushortData(NULL), target(GL_ARRAY_BUFFER)
{
    printf("pointer: %p, size: %lu\n", floatData, floatData->size());
}

Renderer::Buffer::Buffer(vector<GLushort> const& data):
floatData(NULL), ushortData(&data), target(GL_ELEMENT_ARRAY_BUFFER)
{
}
4

3 に答える 3

2

aおよび aBoneHierarchyを受け入れるコンストラクターが独自のベクター メンバーのアドレスを計算する場合、それで問題ありません。彼らの住所は変わりません。Point3DCompassRadians

このコードは代入文も示しています。BoneHierarchy右側のテンポラリのベクトル メンバのアドレスは、左側にBoneHierarchy格納されているオブジェクトのアドレスとは異なりますboneHierarchy。代入演算子でアドレスをコピーしていないことを確認してください。そうしないと、boneHierarchyオブジェクトは、もう存在しない一時オブジェクトのベクター メンバーを参照することになります。コピー コンストラクターも確認する必要があります。

于 2012-04-18T21:29:22.447 に答える
0

それらのアドレスは変更されません。さらに、イニシャライザ リストに含まれていない場合、それらの内容は構築中ずっと有効である必要があります。

于 2012-04-18T21:29:15.863 に答える
0

ここで提供されるコードは十分ではありません。インスタンスを作成したいだけだと仮定すると、代わりに次のコード行を使用します。

 BoneHierarchy boneHierarchy(Point3D(24.5f, 84.0f + HumanBoundingBox::HEIGHT/2.0f ,24.5f), 
 CompassRadians(0.0f), renderingEngine);

これにより、ローカル スタックにインスタンスが作成されます。rob が指摘したように、代入演算子を BoneHierarchy に呼び出す必要があります。

于 2012-04-18T21:33:45.990 に答える