c++ builder 6, проблема при работе с памятью

mae 11.05.2004 - 08:51 | Я написал функцию: -------------------------------- ans* TForm1::unsort(ans *sorted,int length) { int unl=0,e; ans *unsorted=(ans*)malloc(length*sizeof(ans)); while(length>0) { e=random(length); unsorted[unl++]=sorted[e]; length--; Move(&sorted[e+1],&sorted[e],(length-e)*sizeof(ans)); realloc(sorted,length*sizeof(ans)); } free(sorted); return unsorted; } ------------------------------------------ По идее она должна возвращать массив типа ans (структура), в котором элементы "рассортированы" случайным образом. Так и происходит. Но стоит вызвать эту функцию ещё раз, как выходит исключение. Что в ней не так?
mae 1 - 11.05.2004 - 08:52 | то есть один раз вызывается нормально, и делает то, что должна делать. А во второй раз уже идёт исключение. Я подозреваю, что проблема в malloc-e, но что именно тут может быть, ума не приложу...
VaS 2 - 11.05.2004 - 09:23 | sorted уничтожается. Перед вторым вызовом создаешь его снова? unsorted освобождаешь после вызова данной функции?
mae 3 - 11.05.2004 - 19:58 | на самом деле есть только один массив структур, называется vars. Я вызываю функцию так: vars=unsort(vars,5); то есть массив должен "перезаписаться". Это значит, что удалять unsorted после выхода их функции нельзя - удалится vars. А перед вторым вызовом sorted конечно создаётся, ведь это vars передаётся в функцию как параметр. Я так понимаю, что имеется некий массив, и указатель на него (vars). Указатель передаётся в функцию, где создаётся новый массив с новым (временным) указателем, а старый уничтожается, после этого указателю vars "присваивается" новый массив, временный указатель за пределы функции не выходит, я полагаю... В итоге должны имется опять же массив и указатель. Только указатель будет старый, а массив новый. Но указатель будет "правильно" указывать на массив. И при втором вызове функции должно произойти то же самое. Где я не досмотрел? Или может я что-то не так понимаю?
VaS 4 - 11.05.2004 - 20:35 | На первый взгляд все ок :) Покопаю поглубже... Объявление структуры покажи.
VaS 5 - 11.05.2004 - 21:06 | { int Unl = 0; int E; Ans *UnSorted = (Ans*)malloc(Length * sizeof(Ans)); while(Length > 0) { E = random(Length - 1); //иначе в дальнейшем Move(...Sorted[E]...) можно выйти за пределы массива UnSorted[Unl++] = Sorted[E]; Length--; Move(&Sorted[E + 1], &Sorted[E], (Length - E) * sizeof(Ans)); } free(Sorted); return UnSorted; } Ну и убран realloc ибо лишний.
mae 6 - 12.05.2004 - 17:17 | Спасибо. Но я решил проблему при помощи vector. Там оказалось всё намного проще.
mae 7 - 12.05.2004 - 17:27 | Если ещё интересно, то структура объявляется так: ----------- struct ans { AnsiString text; bool right; }; ----------- А функция сейчас выглядит так: vector<ans> unsort(vector<ans> sorted) { vector<ans> unsorted; int e; while(sorted.size()) { e=random(sorted.size()); unsorted.insert(unsorted.end(),sorted[e]); sorted.erase(sorted.begin()+e); } return unsorted; } как видно, удаление элемента массива (т.е. уже вектора) производится элементарно и без гемора. Тему можно прикрывать.
UE 8 - 12.05.2004 - 17:40 | ну так блин, ясно, что траблы были: конструктор AnsiString'а вызывать кто будет? ;) malloc/realloc от new несколько отличаются...

>>