Ребят, у меня тут несколько тупая проблема. Предположим некий код: Code: ... p = new double [n]; T = new double [n]; ... delete [] p; delete [] T; На участке после выделения памяти она вся используется. При трассировке на команде delete [] T; вылетает следующий эксепшн: HEAP[prog.exe]: Heap block at 00365EE8 modified at 00365F34 past requested size of 44 Windows has triggered a breakpoint in prog.exe. Я может быть конечно где-то лажанул, но что-то не понимаю в какую сторону вообще копать. Хелп!
iv. Так сложно сказать - всё вроде верно. Приведи полный сорц - посмотрим. А так много чего может быть, на мой любительский взгляд конечно
Проблему решил, подзабыл адресную арифметику. =) А ошибка в общем-то и говорила, что вышел за пределы выделенной памяти.
Это снова я. Как вызвать перегруженый оператор delete? Перегружал так: void operator delete(void *p, char *fileName, int lineNumber)
Ну и вызывай по своим параметрам... А вообще, я так понял, твой delete не имеет никакого смыслового отношения к настоящему delete, поэтому лучше назови его по другому...
kez, я может не верно выразился... Я имел в виду, что при той реализации, что он хочет лучше реализовать это как обычную функцию... Параметры того оператора, что он хочет реализовать повергают в шок...
Господа, мне нужен именно перегруженный delete, ибо работаю с памятью по-своему. А операторы new и delete имеют обыкновение вызывать конструкторы и деструкторы объектов. Даже при перегрузке. Просто new я перегрузил похожим образом и вызывается он примерно так: Code: DWORD* mem = new(__FILE__, __LINE__) DWORD Следующая хитрость позволяет его вызывать вообще как стандартный: Code: #define new new(__FILE__, __LINE__) Так вот с delete так не прокатывает почему-то. ПС: перегружать с тем же набором параметров мешает то, что эти операторы у меня сидят в dll и при экспорте компилятор ругается. =\ В общем-то, набор параметров на самом деле особого значения не имеет.
Code: void* __cdecl operator new( size_t s ) { OutputDebugString("Trace: new"); return lmalloc( s ); } void __cdecl operator delete( void *p ) { OutputDebugString("Trace: delete"); lfree( p ); }
ААААА, кез, чмокаю тя в носик!!! Выручил. Я почему-то когда делал __declspec(dllexport) void* operator new(size_t size) компилятор ругался..
Эммм, ну __declspec(dllexport) void* operator new(size_t size, DWORD pim, DWORD piu) вполне прокатило и даже работало =)
>>Как можно экспортировать оператор? ну в конечном счете любой перегруженный оператор является функцией, другое дело что не совсем очевидно какое имя будет генерировать компилятор при экспорте..
Народ помогите разобраться с этим кодом уже 2 часа с ним парюсь. (всякая ненужная фигня вырезанна) Code: int main(int argc, char* argv[]) { char com[80]; while(1) { cout<<"# "; gets(com); int iret=command(com); if (iret==2) break; cout<<"\n\n"; } return 0; } int command(char *s) { char * pch; pch = strtok (s," "); while (pch != NULL) { if(!strcmp("-add",pch)) { pch = strtok (NULL, " "); if (pch) { if (!strcmp("s",pch)) { pch = strtok (NULL, " "); add_stud(pch); break; } } cout<<"To get help about command put -help add"; return 1; } if(!strcmp("-exit",pch) || !strcmp("-quit",pch)) { cout<<"Good Buy\n"; return 2; } pch = strtok (NULL, " "); } cout<<"Command is not supported! Put -help to get Help"; return 0; } int add_stud(char *n) { char t[80]; int i5Valu[5]; cout<<"EnterFIO\n"; cin>>t; cout<<"Enter 5 Values\n"; return 1; } дело в том что если мы вводим Code: -add s 1 Вместо 1 может быть что угодно суть не в этом. То на экране появляется запрос на ввод FIO НО когда мы вводим фио и нажимаем ентер то у нас появляются 2 лишние строки с сообщением Code: Command is not supported! Put -help to get Help Откуда????? они там берутся не как немогу догнать. Вот что выводиться на экран. Code: # -add s 1 EnterFIO asdsad Enter 5 Values Command is not supported! Put -help to get Help # Command is not supported! Put -help to get Help #
In fuction int command(char *s) : Code: while (pch != NULL) { ................................... if (!strcmp("s",pch)) { pch = strtok (NULL, " "); add_stud(pch); [B]break;[/B] .................................... } Обрати внимание на break; , он делает выход из твоего цикла while (pch != NULL), а в конце цикла что? Code: cout<<"Command is not supported! Put -help to get Help"; return 0; Сделай вместо break return -1 и всё вроде должно быть норм.
Сейчас на С перехожу. Написал самое простое что есть- Стек написал (не думайте что я в алгоритмах не шарю, кучи Фибоначчи, 3х связные списки и т.д. потом) посмотрите на сами указатели, просто думаю a- массив, int *p=a -коряво или нет? Code: #include <stdio.h> #include <stdlib.h> void Add(int *a[], int *kol, int el); int Del(int *a[], int *kol); void Display(int *a[], int *kol); void Add(int *a[], int *kol, int el) { int *p=a; ++(*kol); *(p+*kol)=el; } int Del(int *a[], int *kol) { if (*kol<=-1) return 0; int *p=a; --(*kol); *(p+*kol+1)=0; return 1; } void Display(int *a[], int *kol) { printf("stack:"); int i; for (i=0; i<=*kol; ++i) { printf("%i,", a[i]); } printf("\n"); } int main(int argc, char *argv[]) { int a[100], el=0, kol=-1,i; int *p=a; while (1) { printf("1:add, -1:del, 0:exit. command="); scanf("%i",&i); if (i==0) break; if (i==1) { printf("ELEMENT="); scanf("%i",&el); Add(a,&kol,el); } if (i==-1) if (!Del(a,&kol)) exit(1); Display(a,&kol); } return 0; }
Честно сказать, не в обиду конечно, но это самый тупой пример работы с указателями который я когда либо видел в жизни, нах... Кучи переменных, которые ты туда сюда тусуешь. Зачем заводить два указателя на один и тот же массив? Под настроение?