2010-09-18 3 views
0

В моем проекте на C++ у меня есть приложение класса и окно класса. Приложение класса имеет параметр: vector<Window*>* window;.Ошибка выполнения доступа к вектору

В конструкторе App он может использовать и push_back Window * на этом векторе отлично, но в моем методе onMessage(), который вызывается WndProc() (я использую winapi), он дает мне когда я пытаюсь использовать вектор. Это ошибки доступа.

Что может произойти неправильно? Если вам нужна дополнительная информация, просто спросите.

+6

Было бы полезно, чтобы увидеть некоторые код. Единственное, что я могу предположить, это то, что он действительно является указателем на вектор, а не на вектор. – skimobear

ответ

2

Либо указатель на вектор недействителен, либо указатели в векторе недействительны; вероятно, первый в этом случае. Это происходит во многих ситуациях, например, с использованием указателей на локальные объекты, которые с тех пор были уничтожены.

(в стороне:. Учитывая, что вы включили точку с запятой для окна, я уверен, что это элемент данных, а не параметр)

Вместо того чтобы хранить векторный указатель в App Store, сохранить сам вектор. Вместо хранения указателей на объекты Window, храните сами объекты Window.

struct App { 
    vector<Window> windows; 
}; 

Однако для этого требуется, чтобы Windows была пригодна для копирования, и, вероятно, нет. Он также запрещает хранение объектов типов, полученных из окна. Вместо этого, вы можете использовать boost::ptr_vector, который «владеет» заостренный к объектам и удалять их, когда они будут удалены (например, когда ptr_vector уничтожается или очищается):

struct App { 
    boost::ptr_vector<Window> windows; 

    App() { 
    // just an example 
    windows.push_back(new Window()); 
    windows.push_back(new DerivedFromWindow()); 
    } 
}; 
+0

Оказывается, что я обращался к объекту, которого не было (указатели ...) –