2015-04-12 2 views
0

Я делаю простую программу сортировки с шаблонами и борюсь со строковым футляром. Код:Ошибка Munmap_chunk(), не могу понять поведение указателя

template<typename typ> 
void Join_Segments(typ *tab, int begin1, int begin2, int end2, bool(*Compare)(typ arg1, typ arg2)){ 
    typ *joined = new typ[end2-begin1+1]; // sorted elements arrray 
    int c1, c2, ci;      // counters 

    for(c1=begin1, c2=begin2, ci=0; c1<begin2 && c2<=end2; ci++){   
    if(!Compare(tab[c1], tab[c2])){ joined[ci]=tab[c2]; c2++;} 
    else{ joined[ci]=tab[c1]; c1++;} 
    } 
    while(c1<begin2){joined[ci]=tab[c1]; c1++; ci++;} 
    while(!(c2>end2)){joined[ci]=tab[c2]; c2++; ci++;} 

    for(int i=0; i<(end2-begin1+1); i++) tab[begin1+i]=joined[i]; 
    delete joined; 
} 

Так это работает замечательно для целых чисел. И он работает для строк, пока я удаляю строку «delete join», но это очень важно для сортировки больших массивов. GDB трассировка журнал:

Program terminated with signal SIGABRT, Aborted. 
#0 0x40022424 in __kernel_vsyscall() 
(gdb) bt 
#0 0x40022424 in __kernel_vsyscall() 
#1 0x40171827 in __GI_raise ([email protected]=6) 
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#2 0x40174c53 in __GI_abort() at abort.c:89 
#3 0x401ac993 in __libc_message ([email protected]=1, 
    [email protected]=0x402a9a5c "*** Error in `%s': %s: 0x%s ***\n") 
    at ../sysdeps/posix/libc_fatal.c:175 
#4 0x401b6e7a in malloc_printerr (action=<optimized out>, 
    str=0x402a9a80 "munmap_chunk(): invalid pointer", ptr=0x90551d4) 
    at malloc.c:4996 
#5 0x401b6f48 in munmap_chunk (p=<optimized out>) at malloc.c:2816 
#6 0x400849df in operator delete(void*)() 
    from /usr/lib/i386-linux-gnu/libstdc++.so.6 
#7 0x08049518 in Join_Segments<std::string> (tab=0x905500c, begin1=0, begin2=2, 
    end2=2, Compare=0x80490a6 <_GLOBAL__sub_I__Z2Nli()+8>) at scalanie.hh:11 
#8 0x080491f5 in Mergesort<std::string> (tab=0x905500c, begin=0, 
    end=2, Compare=0x80490a6 <_GLOBAL__sub_I__Z2Nli()+8>) at scalanie.hh:32 
#9 0x08048ee1 in main() at main.cpp:11 

Я думаю, что это, вероятно, вызвано магией назначения станда :: строки, но я не могу понять, как это исправить. Пробовал много вещей, таких как литье правой руки от ассистента (const typ &), поэтому он скопирует его в соответствии с that documentation, но он все еще пытается вслепую. Может ли кто-нибудь помочь мне с этим?

Я могу предоставить полный код, но он не визуально идентичен (английский не мой родной язык, и я изменил здесь имена функций/var), поэтому его может быть труднее прочитать.

Спасибо!

+0

Вы должны использовать 'delete []', так как это массив, но это всего лишь общая вещь, не обращая внимания на код с достаточным вниманием. –

+0

Ничего себе, просто ничего себе, я был таким глупым. Спасибо, сейчас работает! Кстати, в моем случае «join» не должен быть указателем на первый элемент массива? И не следует ли «удалять присоединенные» только удалить первый istead ошибок бросания? Мне просто интересно. PS. Вы должны добавить его в качестве ответа, чтобы я мог пометить это как разрешенное и не беспокоить других прекрасных людей здесь. – user3142453

+0

Добавлено и ответ :) Ну, что у вас в коде есть указатель на первый элемент. Но что касается этого, «не следует» удалять присоединенные «только удалить первый istead ошибок бросания» - как я уже сказал, стандарт говорит, что смешивание неправильных типов 'new/delete' приведет к неопределенному поведению, поэтому вы не должны полагаться ни на что происходят так, как вы ожидаете. –

ответ

1

Вы должны использовать delete[], так как вы удаляете массив, выделенный new[]. Смешение неправильных типов new/delete может привести к неопределенному поведению в соответствии со стандартом, который, как я думаю, является тем, что вы видите.

Смежные вопросы