【问题标题】:Sample code from VCGlib crashes Visual Studio 2013VCGlib 中的示例代码使 Visual Studio 2013 崩溃
【发布时间】:2014-04-29 16:10:35
【问题描述】:

我现在正在学习 vcglib (http://vcg.sf.net)

我的问题是,当我尝试检查“Locals”或“Auto”窗口中的变量时,以下代码会导致 VS 2013 崩溃。

std::vector<cl_float4> cloud;
std::vector<cl_uchar4> colors;
std::vector<cl_int> valid;

fetchCloud(cloud);
fetchColors(cloud, colors, valid);


class CFace;
class CVertex;
struct MyUsedTypes : public vcg::UsedTypes< 
    vcg::Use<CVertex>       ::AsVertexType,
    vcg::Use<CFace>         ::AsFaceType> {};

/// compositing wanted proprieties
class CVertex : public vcg::Vertex< MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::Color4b, vcg::vertex::BitFlags> {};
class CFace : public vcg::Face< MyUsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::BitFlags > {};
class CMesh : public vcg::tri::TriMesh< std::vector<CFace>, std::vector<CVertex> > {};

CMesh m;
for (size_t k = 0; k < cloud.size(); ++k) {
    if (valid[k]) {
        vcg::tri::Allocator<CMesh>::AddVertex(m,
                                              CMesh::CoordType(cloud[k].s[0], cloud[k].s[1], cloud[k].s[2]), 
                                              vcg::Color4b(colors[k].s[0], colors[k].s[1], colors[k].s[2], 255)
                                              );
    }
}

cout << "saving to file...";
vcg::tri::io::PlyInfo info;
info.mask |= vcg::tri::io::Mask::IOM_VERTCOLOR;
vcg::tri::io::ExporterPLY<CMesh>::Save(m, (base_name + ".ply").c_str(), false, info);
cout << "saved" << endl;

cloud 上面有 50000 到 100000 个元素。这个点云是使用 OpenCL 在 GPU 内存中计算的。函数fetchCloudfetchColors 将各自的数据下载到主机内存中。

我从trimesh_ant_freeglut sample 复制了上面的代码,随vcglib 提供。

我还成功地在 VS2013 中编译并运行了这个示例。它运行良好,我可以随时在调试器中暂停它并检查所有感兴趣的变量。

我还在示例中添加了一个代码,生成了一个由 1000000 个随机点组成的云。当我在调试器中暂停正在运行的示例并检查变量时,VS2013 显示 mesh 变量。

我的源代码和示例代码都包含在与不同项目相同的解决方案中。该解决方案是使用 CMake 生成的。 这些项目之间的主要区别在于一个使用 OpenCL。

我该如何调试这个问题? 我准备提供可能需要的其他信息。 我现在根本不知道我应该提供什么。

更新: 尝试禁用所有扩展 - 仍然没有成功。

Update2:让一位同事编译、运行和调试我的代码 - 他的 Visual Studio 安装也崩溃了。

Update3: 已下载 Visual Studio Update RC2 - 再次崩溃

Update4: 尝试移动源文件中与class CMesh 相关的代码。结果不稳定。 Visual Studio 有时会崩溃,有时不会。如果代码就在main 的左括号之后,则不会发生崩溃。如果此代码和int main(int argc, char **argv) { 之间出现一些说明,则可能会发生崩溃。

我是否认为这段代码在某处损坏了堆栈?

【问题讨论】:

    标签: c++ visual-studio-2013 vcg


    【解决方案1】:

    解决了!通过将类声明移到main()之外:

    那是

    class CFace;
    class CVertex;
    struct MyUsedTypes : public vcg::UsedTypes <
                               vcg::Use<CVertex>       ::AsVertexType,
                               vcg::Use<CFace>         ::AsFaceType > {};
    
    /// compositing wanted proprieties
    class CVertex : public vcg::Vertex < MyUsedTypes, vcg::vertex::Coord3f, vcg::vertex::Normal3f,     vcg::vertex::Color4b, vcg::vertex::BitFlags > {};
    class CFace : public vcg::Face < MyUsedTypes, vcg::face::VertexRef, vcg::face::Normal3f, vcg::face::BitFlags > {};
    class CMesh : public vcg::tri::TriMesh < std::vector<CFace>, std::vector<CVertex> > {};
    
    int main (int argc, char* argv[])
    {
        // blah-blah-blah
        CMesh m;
    
        //  fill m
    }
    

    现在没有崩溃!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多