VCGlib中的示例代码使Visual Studio 2013崩溃

Sample code from VCGlib crashes Visual Studio 2013

本文关键字:Visual Studio 2013 崩溃 代码 VCGlib      更新时间:2023-10-16

我现在正在学习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;

上述中的CCD_ 1具有从50000到100000的元素。该点云是使用OpenCL在GPU内存中计算的。功能fetchCloudfetchColors将各自的数据下载到主机存储器。

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

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

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

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

如何调试此问题?我准备提供可能需要的额外信息。我只是不知道目前我应该提供什么。

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

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

Update3:下载Visual Studio更新RC2-再次,导致崩溃

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

我认为这段代码会破坏某个地方的堆栈,这是对的吗?

已解决!通过将类声明移动到cloud0:之外

那是

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
}

现在没有崩溃!