2016-10-18 8 views
1

Я не могу представить ни одной причины для этого ... вот моего базового классКраша экранной строки внутри указателя хранится в векторе

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

Это работает нормально, но если я наследую TextureElement от элемента

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

Он падает.

Я попытался реализовать метод копирования для TextureElement (я был почти уверен, что это было необязательно), но это не сработало. Любая идея по этому поводу? Спасибо заранее

+0

Что такое 'path'? 'wchar_t *' Думаю? Что, если 'путь == nullptr'? – ivaigult

+1

Куча коррупции также может иметь место. Если куча повреждена, любое распределение памяти может привести к сбою. – ivaigult

+0

Сначала дайте TextureElement виртуальный деструктор. Во-вторых, 'Element' на самом деле не наследует от TextureElement в вашем коде. – AndyG

ответ

3

Если вы унаследовав от Element, вы можете объявить virtual деструктор для правильной очистки:

virtual ~Element() {} 

Кроме того, обратите внимание, когда вы положили сырые указатели ВЛАДЕЮЩЕЙ в std::vector , Рассмотрим вектор smart указатели, такие как vector<unique_ptr<T>> или vector<shared_ptr<T>>.


EDIT

Этот код компилируется просто отлично и, кажется, работает (проверено на VS2015 с обновлением 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; 
} 
+0

Какое преимущество я могу получить от использования shared_ptr в этом случае? btw да, наверное, я должен добавить деструктора, но я думаю, что это не устранит крах –

+1

@FrankEscobar: Суть в том, что вектор исходных указателей владения - это фабрика ошибок и источник «проблемности». Правильные указатели _observing_ в порядке. –

+0

Я пытался с shared_ptr, но он снова сработал –