崩溃访问存储在向量

时间:2016-10-18 11:19:02

标签: c++ pointers inheritance vector wstring

我无法想象这个的一个原因......这是我的基类

class TextureElement
{
public:
    TextureElement(std::wstring mname);
    std::wstring file;
    std::wstring name;
    TexMode texmode;
};

这是一个基本用法:

TextureElement* textureElement = new TextureElement(prename);
mClass->textures.push_back(textureElement);
textureElement->file = path;//<<here crashes if inheritance is done

显然prename和path是wstrings,mstruct mClass包含几个向量,包括这个存储TextureElement * type

的向量

这可以正常但是如果我从Element继承TextureElement

class Element
{
public:
    Element(std::wstring mname, ElementType t);
    Element(){};
    ~Element();
    ElementType type;
    std::wstring name;
}; 

它崩溃了。

我尝试过为TextureElement实现复制方法(我几乎可以肯定这是不必要的),但它没有用。 有什么想法吗?提前谢谢

1 个答案:

答案 0 :(得分:3)

如果您继承自Element,则可能需要声明 virtual析构函数以进行正确清理:

virtual ~Element() {}

此外,在std::vector中添加原始拥有指针时请注意。考虑使用智能指针的向量,例如vector<unique_ptr<T>>vector<shared_ptr<T>>

修改

此代码编译得很好并且似乎有效(在VS2015上使用Update 3测试):

#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;

enum class ElementType
{
    Texture,
    Foo,
    Bar
};

class Element
{
public:
    Element(const wstring& name, ElementType type) 
        : Name(name), Type(type)
    {}

    virtual ~Element() {}

    ElementType Type;
    wstring Name;
};

class TextureElement : public Element
{
public:
    explicit TextureElement(const wstring &name)
        : Element(name, ElementType::Texture)
    {}

    wstring File;
};

int main()
{
    vector<shared_ptr<Element>> v;

    auto p = make_shared<TextureElement>(L"Test");
    v.push_back(p);
    p->File = L"C:\\Some\\File";

    wcout << p->File;
}