오류 : free () : 잘못된 다음 크기 (빠름) :


91

이 이상한 오류는 무엇입니까? Ubuntu 10.10에서 g ++를 사용하여 C ++를 컴파일하고 있습니다. 실행 파일을 실행할 때 무작위로 나타납니다 (아마도 8 시간에 2 번, 한 시간에 10 번 컴파일). 그러나 정리하고 다시 컴파일하면 대부분의 시간이 사라집니다.

*** glibc detected *** ./emailQueue.app: free(): invalid next size (fast): 0x0000000001c40270 ***
======= Backtrace: =========
/lib/libc.so.6(+0x774b6)[0x7f490d95e4b6]
/lib/libc.so.6(cfree+0x73)[0x7f490d964c83]
./emailQueue.app[0x401f47]
/lib/libc.so.6(__libc_start_main+0xfe)[0x7f490d905d8e]
./emailQueue.app[0x401cc9]
======= Memory map: ========
00400000-0040d000 r-xp 00000000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
0060d000-0060e000 r--p 0000d000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
0060e000-0060f000 rw-p 0000e000 08:01 1311132                            /home/server/Projects/email/emailQueue.app
01c40000-01c82000 rw-p 00000000 00:00 0                                  [heap]
7f4908000000-7f4908021000 rw-p 00000000 00:00 0 
7f4908021000-7f490c000000 ---p 00000000 00:00 0 
7f490ce52000-7f490ce5e000 r-xp 00000000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490ce5e000-7f490d05d000 ---p 0000c000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05d000-7f490d05e000 r--p 0000b000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05e000-7f490d05f000 rw-p 0000c000 08:01 1051251                    /lib/libnss_files-2.12.1.so
7f490d05f000-7f490d075000 r-xp 00000000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d075000-7f490d275000 ---p 00016000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d275000-7f490d276000 r--p 00016000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d276000-7f490d277000 rw-p 00017000 08:01 1048770                    /lib/libz.so.1.2.3.4
7f490d277000-7f490d28e000 r-xp 00000000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d28e000-7f490d48d000 ---p 00017000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48d000-7f490d48e000 r--p 00016000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48e000-7f490d48f000 rw-p 00017000 08:01 1051248                    /lib/libnsl-2.12.1.so
7f490d48f000-7f490d491000 rw-p 00000000 00:00 0 
7f490d491000-7f490d49a000 r-xp 00000000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d49a000-7f490d69a000 ---p 00009000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69a000-7f490d69b000 r--p 00009000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69b000-7f490d69c000 rw-p 0000a000 08:01 1051244                    /lib/libcrypt-2.12.1.so
7f490d69c000-7f490d6ca000 rw-p 00000000 00:00 0 
7f490d6ca000-7f490d6e2000 r-xp 00000000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d6e2000-7f490d8e1000 ---p 00018000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e1000-7f490d8e2000 r--p 00017000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e2000-7f490d8e3000 rw-p 00018000 08:01 1051256                    /lib/libpthread-2.12.1.so
7f490d8e3000-7f490d8e7000 rw-p 00000000 00:00 0 
7f490d8e7000-7f490da61000 r-xp 00000000 08:01 1048743                    /lib/libc-2.12.1.so
7f490da61000-7f490dc60000 ---p 0017a000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc60000-7f490dc64000 r--p 00179000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc64000-7f490dc65000 rw-p 0017d000 08:01 1048743                    /lib/libc-2.12.1.so
7f490dc65000-7f490dc6a000 rw-p 00000000 00:00 0 
7f490dc6a000-7f490dc7f000 r-xp 00000000 08:01 1048655                    /lib/libgcc_s.so.1
7f490dc7f000-7f490de7e000 ---p 00015000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de7e000-7f490de7f000 r--p 00014000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de7f000-7f490de80000 rw-p 00015000 08:01 1048655                    /lib/libgcc_s.so.1
7f490de80000-7f490df02000 r-xp 00000000 08:01 1051246                    /lib/libm-2.12.1.so
7f490df02000-7f490e101000 ---p 00082000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e101000-7f490e102000 r--p 00081000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e102000-7f490e103000 rw-p 00082000 08:01 1051246                    /lib/libm-2.12.1.so
7f490e103000-7f490e1eb000 r-xp 00000000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e1eb000-7f490e3ea000 ---p 000e8000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3ea000-7f490e3f2000 r--p 000e7000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3f2000-7f490e3f4000 rw-p 000ef000 08:01 4853329                    /usr/lib/libstdc++.so.6.0.14
7f490e3f4000-7f490e409000 rw-p 00000000 00:00 0 
7f490e409000-7f490e5c7000 r-xp 00000000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e5c7000-7f490e7c7000 ---p 001be000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e7c7000-7f490e7cc000 r--p 001be000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e7cc000-7f490e816000 rw-p 001c3000 08:01 4851315                    /usr/lib/libmysqlclient.so.16.0.0
7f490e816000-7f490e817000 rw-p 00000000 00:00 0 
7f490e817000-7f490e837000 r-xp 00000000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea15000-7f490ea1c000 rw-p 00000000 00:00 0 
7f490ea33000-7f490ea37000 rw-p 00000000 00:00 0 
7f490ea37000-7f490ea38000 r--p 00020000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea38000-7f490ea39000 rw-p 00021000 08:01 1048597                    /lib/ld-2.12.1.so
7f490ea39000-7f490ea3a000 rw-p 00000000 00:00 0 
7fffb85b9000-7fffb85da000 rw-p 00000000 00:00 0                          [stack]
7fffb85ff000-7fffb8600000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

1
세미콜론이 누락되어이 오류가 발생했습니다.
atzol

답변:


108

메모리 오류가 있음을 의미합니다. 당신이하려고 할 수 있습니다 free에 의해 할당되지 않은 포인터 malloc(또는 delete에 의해 생성되지 않은 객체 new) 또는 당신이하려고 할 수있다 free/ delete두 번 이상 같은 객체입니다. 버퍼 오버플로가 발생하거나 쓰면 안되는 메모리에 쓰면 힙 손상이 발생할 수 있습니다.

프로그래밍 오류가 많으면이 문제가 발생할 수 있습니다. 디버거를 사용하고 역 추적을 가져 와서 오류가 발생했을 때 프로그램이 무엇을하는지 확인해야합니다. 이것이 실패하고 이전 시점에서 힙이 손상되었다고 판단되면 고통스러운 디버깅을 할 수 있습니다.


37
valgrind와 같은 도구는 이러한 유형의 오류의 원인을 찾을 때 매우 유용합니다. 디버깅 기호로 컴파일했는지 확인하십시오.
Daniel Gallagher

3
참고 : std :: vector <> 크기를 조정 한 후 이런 일이 발생했지만 충분히 크지 않았습니다.
Adam27X

1
정말? 벡터가 충분히 크지 않을 때 free ()에 문제가 있습니다. 적어도 먼저 질문을 읽으십시오.
gyan

22

내 프로그램에서 동적 메모리 할당을하지 않았지만 동일한 문제가 발생했지만 메모리를 할당하지 않고 벡터의 인덱스에 액세스하고있었습니다. 따라서 동일한 경우에 resize()벡터 요소를 사용하여 일부 메모리를 할당 한 다음 액세스 하는 것이 좋습니다 .


7

코드가 필요하지만 일반적으로 free()할당되지 않은 포인터에서 메모리 를 시도 할 때 나타납니다 . 이것은 종종 당신이 이중으로 풀릴 때 발생합니다.


6

다음과 같이 포인터 배열에 공간을 할당하려는 경우

char** my_array_of_strings;  // or some array of pointers such as int** or even void**

n 포인터에 공간을 할당 할 때 워드 크기 (64 비트 시스템에서는 8 바이트, 32 비트 시스템에서는 4 바이트)를 고려해야합니다. 포인터의 크기는 단어 크기와 동일합니다.

따라서 n 개의 포인터에 공간을 할당하고 싶을 수 있지만 실제로는 n x 8 또는 4 (각각 64 비트 또는 32 비트 시스템의 경우)가 필요합니다.

8 바이트의 n 개 요소에 대해 할당 된 메모리 오버 플로우를 방지하려면 다음을 수행하십시오.

my_array_of_strings = (char**) malloc( n * 8 );  // for 64-bit systems
my_array_of_strings = (char**) malloc( n * 4 );  // for 32-bit systems

그러면 각각 8 바이트 (또는 32 비트 시스템을 사용하는 경우 4 바이트)로 구성된 n 개의 포인터 블록이 반환됩니다.

나는 당신이 단어 크기를 보상하지 않았을 때 리눅스가 모든 n 포인터를 사용할 수 있도록 허용 할 것이라는 것을 알아 챘지만, 당신이 그 메모리를 비우려고 할 때 그것은 실수를 깨닫고 다소 불쾌한 오류를 내고있다. 그리고 그것은 나쁜 것입니다. 할당 된 메모리를 오버플로하면 많은 보안 문제가 기다리고 있습니다.


3
를 사용하여 4 바이트 또는 8 바이트를 하드 코딩하는 대신 동일한 코드를 모든 시스템에 일반화 할 수 있습니다 sizeof(char*).
Ben G.

sizeofmalloc을 사용할 때 연산자를 사용 하지 않는 것은 실제로 문제를 요구하는 것입니다. IIRC 표준은 문자의 크기를 보장하지만 거의 모든 것은 ISA에 달려 있으므로 sizeof모든 곳 에서 사용하는 것이 가장 좋습니다 .
ajxs

1

누군가가 크기를 조정할 때 코드가 STL의 API를 우회하고 배열에 안전하지 않게 쓰는 상황이 발생했습니다. 여기에 어설 션을 추가하면 다음과 같이 잡혔습니다.

void Logo::add(const QVector3D &v, const QVector3D &n)
{
 GLfloat *p = m_data.data() + m_count;
 *p++ = v.x();
 *p++ = v.y();
 *p++ = v.z();
 *p++ = n.x();
 *p++ = n.y();
 *p++ = n.z();
 m_count += 6;
 Q_ASSERT( m_count <= m_data.size() );
}

1

비슷한 오류가 발생했습니다. 서둘러 한 멍청한 실수였습니다. 크기 int a []를 선언하지 않은 정수 배열에 액세스를 시도합니다. C ++ 컴파일러는 main에 있다면 이러한 오류를 쉽게 포착했을 것입니다. 그러나이 특정 int 배열이 객체 내부에서 선언되었으므로 내 객체와 동시에 생성되고 (많은 객체가 생성되고 있음) 컴파일러가 free () : invalid next size (normal) 오류를 던졌습니다. 나는 이것에 대한 두 가지 설명을 생각했습니다 (누군가가 더 많은 것을 알고 있다면 저를 계몽하십시오). 이 int. 2.) 프로그램에 필요한 메모리는 사실상 무한했으며이를 할당하기 위해 다른 모든 메모리를 확보했습니다.

단순한:

    int* a;
    class foo{ 
    foo(){
       for(i=0;i<n;i++)
           a=new int[i];
     }

문제를 해결했습니다. 그러나 컴파일러가 오류를 "실제로"찾을 수 없기 때문에 이것을 디버깅하는 데 많은 시간이 걸렸습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.