удаление указателя на указатель является ошибкой во время выполнения? - PullRequest
0 голосов
/ 25 февраля 2020

У меня простой вопрос об указателях. Почему, когда я пытался удалить указатель, который указывает на указатель (маленький указатель указывает на новую переменную (новое выделение памяти)), я всегда получаю ошибку во время выполнения? ? (как показано ниже :)))

#include <iostream>

using namespace std;


int main() {
    int *a=new int;
    *a=10;
    int **aa=&a;
    cout<<*a<<endl;
    cout<<**aa<<endl;
    delete aa;// when i comment this line the program work as well as expectied
       return 0;
}

и как я могу удалить указатель, указывающий на другой указатель ??

я получаю эту ошибку при попытке запустить предыдущий код

10
10
*** Error in `/home/abdullah/CLionProjects/tstt1/cmake-build-debug/tstt1': munmap_chunk(): invalid pointer: 0x00007ffef8e9dbb0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7fa3a9c5ebfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7fa3a9c64fc6]
/home/abdullah/CLionProjects/tstt1/cmake-build-debug/tstt1(+0xa4e)[0x5590e44c0a4e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7fa3a9c0e2e1]
/home/abdullah/CLionProjects/tstt1/cmake-build-debug/tstt1(+0x8ba)[0x5590e44c08ba]
======= Memory map: ========
5590e44c0000-5590e44c1000 r-xp 00000000 08:07 1836009                    /home/abdullah/CLionProjects/tstt1/cmake-build-debug/tstt1
5590e46c0000-5590e46c1000 r--p 00000000 08:07 1836009                    /home/abdullah/CLionProjects/tstt1/cmake-build-debug/tstt1
5590e46c1000-5590e46c2000 rw-p 00001000 08:07 1836009                    /home/abdullah/CLionProjects/tstt1/cmake-build-debug/tstt1
5590e50f2000-5590e5124000 rw-p 00000000 00:00 0                          [heap]
7fa3a9bee000-7fa3a9d83000 r-xp 00000000 08:07 2761474                    /usr/lib/x86_64-linux-gnu/libc-2.24.so
7fa3a9d83000-7fa3a9f83000 ---p 00195000 08:07 2761474                    /usr/lib/x86_64-linux-gnu/libc-2.24.so
7fa3a9f83000-7fa3a9f87000 r--p 00195000 08:07 2761474                    /usr/lib/x86_64-linux-gnu/libc-2.24.so
7fa3a9f87000-7fa3a9f89000 rw-p 00199000 08:07 2761474                    /usr/lib/x86_64-linux-gnu/libc-2.24.so
7fa3a9f89000-7fa3a9f8d000 rw-p 00000000 00:00 0 
7fa3a9f8d000-7fa3a9fa3000 r-xp 00000000 08:07 2761798                    /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7fa3a9fa3000-7fa3aa1a2000 ---p 00016000 08:07 2761798                    /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7fa3aa1a2000-7fa3aa1a3000 r--p 00015000 08:07 2761798                    /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7fa3aa1a3000-7fa3aa1a4000 rw-p 00016000 08:07 2761798                    /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
7fa3aa1a4000-7fa3aa2a7000 r-xp 00000000 08:07 2762304                    /usr/lib/x86_64-linux-gnu/libm-2.24.so
7fa3aa2a7000-7fa3aa4a6000 ---p 00103000 08:07 2762304                    /usr/lib/x86_64-linux-gnu/libm-2.24.so
7fa3aa4a6000-7fa3aa4a7000 r--p 00102000 08:07 2762304                    /usr/lib/x86_64-linux-gnu/libm-2.24.so
7fa3aa4a7000-7fa3aa4a8000 rw-p 00103000 08:07 2762304                    /usr/lib/x86_64-linux-gnu/libm-2.24.so
7fa3aa4a8000-7fa3aa61a000 r-xp 00000000 08:07 2762793                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
7fa3aa61a000-7fa3aa81a000 ---p 00172000 08:07 2762793                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
7fa3aa81a000-7fa3aa824000 r--p 00172000 08:07 2762793                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
7fa3aa824000-7fa3aa826000 rw-p 0017c000 08:07 2762793                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22
7fa3aa826000-7fa3aa82a000 rw-p 00000000 00:00 0 
7fa3aa82a000-7fa3aa84d000 r-xp 00000000 08:07 2761022                    /usr/lib/x86_64-linux-gnu/ld-2.24.so
7fa3aaa2e000-7fa3aaa32000 rw-p 00000000 00:00 0 
7fa3aaa49000-7fa3aaa4d000 rw-p 00000000 00:00 0 
7fa3aaa4d000-7fa3aaa4e000 r--p 00023000 08:07 2761022                    /usr/lib/x86_64-linux-gnu/ld-2.24.so
7fa3aaa4e000-7fa3aaa4f000 rw-p 00024000 08:07 2761022                    /usr/lib/x86_64-linux-gnu/ld-2.24.so
7fa3aaa4f000-7fa3aaa50000 rw-p 00000000 00:00 0 
7ffef8e7e000-7ffef8e9f000 rw-p 00000000 00:00 0                          [stack]
7ffef8ed9000-7ffef8edc000 r--p 00000000 00:00 0                          [vvar]
7ffef8edc000-7ffef8ede000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

есть идеи? :(

1 Ответ

5 голосов
/ 25 февраля 2020

aa указывает на a, который является переменной стека. Вы можете только delete объекты, которые были созданы с использованием new.

Вы пытаетесь удалить созданный вами int с помощью new? В этом случае вы хотели бы попробовать delete *aa.

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