unique_ptr&vector,尝试访问已删除的函数,Visual Studio 2013

Vit*_*ali 21 c++ unique-ptr visual-c++ visual-studio-2013 oglplus

我正在尝试使用unique_ptr来管理我的记忆,而VS2013似乎在给我带来麻烦,我认为它不应该.

似乎编译器无论出于什么原因试图访问已删除的拷贝构造函数,而它真的应该没有理由这样做.

这是我的一个类看起来像:

class Mesh
{
public:
    Mesh(oglplus::Program* program, const std::vector<Vertex>& vertices, 
                    const std::vector<GLuint>& indices);
    void draw();
private:
    const oglplus::Program* _program;
    std::vector<Vertex> _vertices;
    std::vector<GLuint> _indices;
    oglplus::Buffer _faceBuffer;
    oglplus::Buffer _vertexBuffer;
    oglplus::VertexArray _vao;
};

class Model
{
public:
    Model(std::string filename, oglplus::Program* program);
    void draw();
private:
    const oglplus::Program* _program;
    std::vector<std::unique_ptr<Mesh>> _meshes;
};
Run Code Online (Sandbox Code Playgroud)

问题出在线上

 std::vector<std::unique_ptr<Mesh>> _meshes;
Run Code Online (Sandbox Code Playgroud)

它开始喷出像这样的东西

2>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(593): error C2280: 'std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\memory(1486) : see declaration of 'std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>::unique_ptr'
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(592) : while compiling class template member function 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)'
2>          with
2>          [
2>              _Ty=std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>
2>          ]
2>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Ty>::construct(_Ty *,const _Ty &)' being compiled
2>          with
2>          [
2>              _Ty=std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>
2>          ]
2>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits(572) : see reference to class template instantiation 'std::allocator<_Ty>' being compiled
2>          with
2>          [
2>              _Ty=std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>
2>          ]
2>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\vector(650) : see reference to class template instantiation 'std::is_empty<_Alloc>' being compiled
2>          with
2>          [
2>              _Alloc=std::allocator<std::unique_ptr<Model::Mesh,std::default_delete<Model::Mesh>>>
2>          ]
2>          c:\users\vitali\projects\3d-stg\source\model\model.hpp(45) : see reference to class template instantiation 'std::vector<std::unique_ptr<Model::Mesh,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>' being compiled
2>          with
2>          [
2>              _Ty=Model::Mesh
2>          ]
2>  model.cpp
Run Code Online (Sandbox Code Playgroud)

我没有使用std::vector::resize()或类似的东西(实际上我注释了我的_meshes向量的所有用法,甚至尝试完全评论实现无济于事),所以我不明白为什么编译器给我问题.

有人有什么想法吗?


谢谢你Preetish Kakkar找到了这个问题.事实证明,编译器生成的函数隐式使用复制构造函数和Mesh类的operator =强制编译器尝试使用已删除的函数.

Bla*_*ole 20

我转载了你的问题,下面是示例代码.

#include <vector>
#include <memory>

class Mesh
{
public: 
    Mesh() {}
    void draw() {}
private:
};

class Model
{
public:
    Model() {}
    void draw() {}
private:
    typedef std::unique_ptr<Mesh> MeshUniquePtr;
    std::vector<MeshUniquePtr> _meshes;
};


int _tmain(int argc, _TCHAR* argv[])
{
    Model m;
    Model m1;
    m = m1; // causes error as you can't copy unique ptr

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是在某些时候你试图复制两个模型对象,由于unique_ptr不可复制,因此无法完成.

  • 或者您可以通过从Ship(const Ship&)=默认值中删除默认值来修复它; 如果你想只是没有可以复制的船只,那么只需将赋值和复制构造函数设为私有 - 不要提供默认实现,因为默认情况下会尝试复制内部导致错误. (2认同)