Помощ - проблем с new

3 отговора 235 прегледа
#1

Помощ - проблем с new

Привет,
Пиша един клас за работа с (наистина ) дълги числа, представени като С стрингове. Задачата ми, всъщност, е да се реализира алгоритъма за умножение на дълги числа, който е описан с псевдокод в книгата "Програмиране = ++Алгоритми;" - (стр. 432 от старото/синьо издание). Въпросният алгоритъм използва триклонова рекурсия за решаването на задачата.
Реализацията е почти готова: операторите +, - и т.н. работят ОК. Е има мегдан да се оптимизира тук-таме особено изваждането.
Обаче при умножение на малко по-голями числа (32 цифри и нагоре) получавам SIGSERV - Segmantation fault при заделяне на памет. От два дена се опитвам да дебъгна програмата и вече чувствам, че зациклям.
Например при едни входни данни, на изплуване от дъното на третото рекурсивно (r3 = rb.Mult(rd);), където rb и rd са нули си се получава нула, но при присвояването, в следния фрагмент:
Str_Int &Str_Int::operator=(Str_Int SInt) {
unsigned long l = SInt.Chr_Len;
if (Num) { this->~Str_Int(); }
if (l) {
Num = new char [l];
Chr_Len = l;
Num_Len = SInt.Num_Len;
Sign = SInt.Sign;
for (unsigned long i = 0; i < l; i++) Num = SInt.Num;
}
return *this;
}
В реда Num = new char [l]; получавам грешката, която споменах. В класа Chr_Len е дължината на стринга, а Num_Len дължината в брой цифри на числото (без водещите нули). В случая имаме SInt.Num = '0'; Chr_Len=Num_Len = 1. Е защо тогава скромния ред Num = new char [l]; за l = 1 дава тази грешка?
Ако някой има желание и време да пусне един дебъгър нека ми пише на ICQ: 208046775 и ще му изпратя пърния код.
Предварително благодаря

Отговор
в отговор на Oxff #2

Re: Помощ - проблем с new

e towa kak da si go preweda ???
this->~Str_Int();

Отговор
в отговор на beginner #3

Re: Помощ - проблем с new

Rychno izvikvane na destruktora

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор
в отговор на Oxff #4

Re: проблем с new-решен

Оправих се :-) Мерси все пак.
На всички мога да препоръчам да си имат един - два memory debuggers под ръка и по - специално valgrind за ползващите Linux. Че един сбъркан индекс или delete без [] наистина могат да ти направят живота черен.

Enjoy

Отговор