Удаление проблемы с указателями - PullRequest
0 голосов
/ 30 апреля 2011

У меня проблемы с удалением созданных мной указателей.Программа создает двойной указатель для указания на потоки.Затем он создает потоки динамически.В конце он удаляет их, но я получаю ошибку glibc.Это использует повышение, чтобы создать потоки.То, что действительно озадачивает, - то, что я удаляю подобный двойной указатель точно таким же способом, и это прекрасно работает.Проблема в конце блока кода под заголовком /*clean up*/:

boost :: thread** thrds;

//create threads and bind to p_variantforloop_t
thrds = new boost::thread*[numThreads];

for (int i = 1; i <= numThreads; i++)
    thrds[i] = new boost::thread(boost::bind(&p_variantforloop_t, 
        E, A, D, (i*n-n)/i ,(i*n)/n, numThreads, n)); 

/* join threads */
for (int i = 0; i < numThreads; i++)
    thrds[i]->join();

/* cleanup */
for (int i = 0; i < numThreads; i++)
    delete thrds[i];
delete[] thrds;

Ошибка:

*** glibc detected *** ./hw9: munmap_chunk(): invalid pointer: 0x0957d480 ***======= Backtrace: =========/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x264591]/lib/tls/i686/cmov/libc.so.6(+0x6c80e)[0x26580e]/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x529741]./hw9[0x804a0d1]/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x20fbd6]./hw9[0x8049871]======= Memory map: ========001f9000-0034c000 r-xp 00000000 08:02 1128663 /lib/tls/i686/cmov/libc-2.11.1.so0034c000-0034d000 ---p 00153000 08:02 1128663 /lib/tls/i686/cmov/libc-2.11.1.so0034d000-0034f000 r--p 00153000 08:02 1128663 /lib/tls/i686/cmov/libc-2.11.1.so0034f000-00350000 rw-p 00155000 08:02 1128663 /lib/tls/i686/cmov/libc-2.11.1.so00350000-00353000 rw-p 00000000 00:00 00046e000-00557000 r-xp 00000000 08:02 982712 /usr/lib/libstdc++.so.6.0.1300557000-00558000 ---p 000e9000 08:02 982712 /usr/lib/libstdc++.so.6.0.1300558000-0055c000 r--p 000e9000 08:02 982712 /usr/lib/libstdc++.so.6.0.130055c000-0055d000 rw-p 000ed000 08:02 982712 /usr/lib/libstdc++.so.6.0.130055d000-00564000 rw-p 00000000 00:00 0005ad000-005d1000 r-xp 00000000 08:02 1130719 /lib/tls/i686/cmov/libm-2.11.1.so005d1000-005d2000 r--p 00023000 08:02 1130719 /lib/tls/i686/cmov/libm-2.11.1.so005d2000-005d3000 rw-p 00024000 08:02 1130719 /lib/tls/i686/cmov/libm-2.11.1.so00950000-00965000 r-xp 00000000 08:02 1130743 /lib/tls/i686/cmov/libpthread-2.11.1.so00965000-00966000 r--p 00014000 08:02 1130743 /lib/tls/i686/cmov/libpthread-2.11.1.so00966000-00967000 rw-p 00015000 08:02 1130743 /lib/tls/i686/cmov/libpthread-2.11.1.so00967000-00969000 rw-p 00000000 00:00 000a67000-00a7a000 r-xp 00000000 08:02 176445 /usr/lib/libboost_thread.so.1.40.000a7a000-00a7b000 r--p 00013000 08:02 176445 /usr/lib/libboost_thread.so.1.40.000a7b000-00a7c000 rw-p 00014000 08:02 176445 /usr/lib/libboost_thread.so.1.40.000bc7000-00be2000 r-xp 00000000 08:02 1128318 /lib/ld-2.11.1.so00be2000-00be3000 r--p 0001a000 08:02 1128318 /lib/ld-2.11.1.so00be3000-00be4000 rw-p 0001b000 08:02 1128318 /lib/ld-2.11.1.so00c34000-00c3b000 r-xp 00000000 08:02 1130745 /lib/tls/i686/cmov/librt-2.11.1.so00c3b000-00c3c000 r--p 00006000 08:02 1130745 /lib/tls/i686/cmov/librt-2.11.1.so00c3c000-00c3d000 rw-p 00007000 08:02 1130745 /lib/tls/i686/cmov/librt-2.11.1.so00ccf000-00cd0000 r-xp 00000000 00:00 0 [vdso]00e85000-00ea2000 r-xp 00000000 08:02 1128359 /lib/libgcc_s.so.100ea2000-00ea3000 r--p 0001c000 08:02 1128359 /lib/libgcc_s.so.100ea3000-00ea4000 rw-p 0001d000 08:02 1128359 /lib/libgcc_s.so.108048000-0804e000 r-xp 00000000 00:1d 10184 /home/tparisi/Desktop/source_code_hw5/hw90804e000-0804f000 r--p 00005000 00:1d 10184 /home/tparisi/Desktop/source_code_hw5/hw90804f000-08050000 rw-p 00006000 00:1d 10184 /home/tparisi/Desktop/source_code_hw5/hw90957d000-0959e000 rw-p 00000000 00:00 0 [heap]b68bf000-b68c0000 ---p 00000000 00:00 0b68c0000-b70c0000 rw-p 00000000 00:00 0b70c0000-b70c1000 ---p 00000000 00:00 0b70c1000-b78c4000 rw-p 00000000 00:00 0b78e8000-b78eb000 rw-p 00000000 00:00 0bfc07000-bfc1c000 rw-p 00000000 00:00 0 [stack]Aborted

1 Ответ

3 голосов
/ 30 апреля 2011

Вы опускаете первый элемент массива при создании объекта потока. Он остается со значением неинициализированного указателя, что позже приводит к ошибке неверного указателя.

Существует также проблема записи в память сразу после последнего элемента массива, что вы также делаете в проблемном цикле (т.е. в первом for в вашем коде).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...