Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление обьекта / 11 сообщений из 11, страница 1 из 1
12.03.2006, 14:33
    #33594940
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
В оконной процедуре на сообщение WM_CREATE создаю обьект выделяя под него память из кучи:

Код: plaintext
Type *Object = new Type;

Мне надо освободить эту память при закрытии окна. Сначала ложу указатель в окно:

Код: plaintext
SetWindowLongPtr(hWnd, GWLP_USERDATA, (DWORD)Object);

Потом на сообщение WM_DESTROY мне надо уничтожить его:

Код: plaintext
1.
Type *Object = (Type *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
delete Object;

Но на операторе delete программа вылетает с ошибкой. В чем может быть проблемма?
...
Рейтинг: 0 / 0
12.03.2006, 15:37
    #33594979
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Проверь значение этого указателя после выделения памяти и перед сохранением. Проверь, что сделано это :

Reserve extra window memory by specifying a nonzero value in the cbWndExtra member of the WNDCLASSEX structure used with the RegisterClassEx function.
...
Рейтинг: 0 / 0
12.03.2006, 16:37
    #33595019
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Значния до и после сходятся
...
Рейтинг: 0 / 0
12.03.2006, 18:08
    #33595060
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
А если попробовать удалить объект сразу после создания. Может проблема в деструкторе объекта, а не в окне.
...
Рейтинг: 0 / 0
16.03.2006, 13:52
    #33605295
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Похоже дело все же в деструкторе. Поставил delete сразу после создания обьекта( не пользуясь S(G)etWindowLongPtr() ), и код все равно умирает на delete. Но что может быть не так в деструкторе? У меня там нет никакого кода. Может дело в том что в классе есть члены-вектора — может их надо перед удалением памяти отдельно уничтожать(но они заводились не с помошью new)?
...
Рейтинг: 0 / 0
16.03.2006, 14:25
    #33605450
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Eugene7Похоже дело все же в деструкторе. Поставил delete сразу после создания обьекта( не пользуясь S(G)etWindowLongPtr() ), и код все равно умирает на delete. Но что может быть не так в деструкторе? У меня там нет никакого кода. Может дело в том что в классе есть члены-вектора — может их надо перед удалением памяти отдельно уничтожать(но они заводились не с помошью new)?
деструктор виртуальный?
...
Рейтинг: 0 / 0
16.03.2006, 14:53
    #33605581
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Сергей Ильич Eugene7Похоже дело все же в деструкторе. Поставил delete сразу после создания обьекта( не пользуясь S(G)etWindowLongPtr() ), и код все равно умирает на delete. Но что может быть не так в деструкторе? У меня там нет никакого кода. Может дело в том что в классе есть члены-вектора — может их надо перед удалением памяти отдельно уничтожать(но они заводились не с помошью new)?
деструктор виртуальный?

да
...
Рейтинг: 0 / 0
16.03.2006, 14:56
    #33605588
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
На Type и его конструктор бы посмотреть...
...
Рейтинг: 0 / 0
16.03.2006, 16:14
    #33605890
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Попробуй передать delete не void*, а указатель на конкреный тип или на корень иерахии от которого он наследуется.
...
Рейтинг: 0 / 0
16.03.2006, 16:15
    #33605893
Сергей Ильич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
Пардон, не досмотрел код
...
Рейтинг: 0 / 0
16.03.2006, 16:38
    #33605980
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление обьекта
_БалтикаНа Type и его конструктор бы посмотреть...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
class LVGrid
{
friend LRESULT CALLBACK ListView_WndProc(HWND, UINT, WPARAM, LPARAM);
friend LRESULT CALLBACK ListViewParent_WndProc(HWND, UINT, WPARAM, LPARAM);

typedef vector < pair<unsigned short, pair<unsigned short, pair<bool, bool>         > > > EditIndexesColumns;
typedef pair<unsigned short, pair<unsigned short,pair<bool,bool> > > EditType;
typedef vector < EditType >::size_type size_type;
typedef vector < pair<unsigned short, vector<string> > > ComboIndexesColumns;
typedef pair<unsigned short, vector<string> > ComboType;
typedef vector < unsigned short > IndexesColumns;

public:
	LVGrid(void);
	virtual ~LVGrid(void);
   
	int GetLvHandle(void);

 	void SetLvHandle(HWND) THROW(exception);
	
	void SetLvParam( const IndexesColumns&, const IndexesColumns&, const IndexesColumns& );
	void SetLvParam( const IndexesColumns&, const IndexesColumns&, const ComboIndexesColumns& );
	void SetLvParam( const EditIndexesColumns&, const IndexesColumns&, const IndexesColumns&);
	void SetLvParam( const EditIndexesColumns&, const IndexesColumns&, const ComboIndexesColumns&);
	
private:
	HWND _hLV,  hLVParent;
	WNDPROC origLVWndProc, origLVParentWndProc;
	
	IndexesColumns CheckColumns;   
	EditIndexesColumns EditColumns;
 	ComboIndexesColumns ComboColumns;
	vector< pair<unsigned short, HWND> > ComboColHwnd;
	int Combo_CurentRow;
	unsigned short SelectedRow, SelectedCol; 
            ... /*еще куча inline функций*/
}

LVGrid::LVGrid()
{
    _hLV =  0 ;
    origLVWndProc =  0 ;
    SelectedRow = - 1 ; SelectedCol = - 1 ;
    Combo_CurentRow = - 1 ;
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление обьекта / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]