如何调试由类型特征引起的这个bug?

时间:2013-12-07 19:52:05

标签: c++ sqlite memory typetraits bulletphysics

我的应用程序中遇到了一个非常奇怪的错误。这是一个在其他图书馆中使用Bullet Physics的视频游戏。

实现SQLite接口后,碰撞检测变得混乱。玩家会穿过地形,或与不可见的物体碰撞。对我而言,它看起来像是错误的内存访问。数据库功能可以正常工作。

我已经可以缩小这个问题。 SQLite接口使用由不同的可存储类型提供的类型特征。在评论所有特质专业化时,碰撞工作正常。

如何找到此错误的原因?如果有任何其他信息对解决问题有用,请告诉我,以便我可以将其纳入问题。

更新:这是我需要评论正确冲突的代码。可存储类型为Person

类型/人/ type.h

#pragma once
struct Person
{
    float Height, Mass;
    // ...
};

类型/人/ trait.h

#pragma once
#include "type.h"
#include "manager/data/manager.h"
using namespace std;

template <>
struct ManagerDataTrait<Person>
{
    static const unordered_map<string, string> Fields;
    static void Serialize(Person *Instance, ManagerData::Serialization *Data)
    {
        Data->FLOAT("height", Instance->Height);
        Data->FLOAT("mass",   Instance->Mass);
    }
    static void Deserialize(Person *Instance, ManagerData::Deserialization *Data)
    {
        Instance->Height = Data->FLOAT("height");
        Instance->Mass   = Data->FLOAT("mass");
    }
};

类型/人/ general.cpp

#include "type.h"
#include "trait.h"
using namespace std;

const unordered_map<string, string> ManagerDataTrait<Person>::Fields = []{
    unordered_map<string, string> fields;
    fields.insert(std::make_pair("height", "FLOAT"));
    fields.insert(std::make_pair("mass", "FLOAT"));
    return fields;
}();

1 个答案:

答案 0 :(得分:0)

用户Yakk在评论中回答了我的问题。

  

专业化应该在类型旁边可见。发生未定义的行为   如果一个单位看到它而另一个单位没有看到它。