2016-02-11 1 views
0
int* doubleArray(int *ptr, int n){ 
delete[] ptr; 
int size = 2*n; 
int * tmp = new int[size]; 
ptr = tmp; 
delete [] tmp; 
return ptr; 
} 

, когда я запускаю этот код, чтобы удвоить размер массива он заканчивается в вине Сегментация и когда я бегу Valgrind он отображает это сообщение:C++ Valgrind утратившим удалить динамический массив

Invalid free()/delete/delete[]/realloc() 
==96889== at 0x4A08634: operator delete[](void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==96889== by 0x400C9E: doubleArray(int*, int) (debug.cpp:55) 
==96889== by 0x400B58: main (debug.cpp:34) 
==96889== Address 0xfff000300 is on thread 1's stack 
==96889== in frame #0, created by operator delete[](void*) 

и вот вывод программы:

75 0 760281175 52 1621398400 
*** Error in `./debug': free(): invalid pointer: 0x00007ffd60a49258 *** 
======= Backtrace: ========= 
/lib64/libc.so.6[0x3427c77a8d] 
/lib64/libc.so.6(cfree+0x5cd)[0x3427c83d2d] 
./debug[0x400cd8] 
./debug[0x400b99] 
/lib64/libc.so.6(__libc_start_main+0xf0)[0x3427c20700] 
./debug[0x400a29] 

здесь я инициализировать первый массив с именем из главного

int* ptr = initArray(n); 

int* initArray(int n){ 
int arr[n]; 
int *ptr = arr; 
return ptr; 
} 

любые идеи о том, как исправить эту утечку?

ответ

1

Вы возвращаете указатель на память, который вы просто освободили, позвонив по номеру delete. Поэтому, когда вы обращаетесь к адресу памяти, возвращаемому этой функцией, вы, вероятно, получаете нарушение сегментации.

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

int* doubleArray(int *ptr, int n){ 
    int* new_array = new int[n << 1]; // n << 1 == 2*n 
    for (int i = 0; i < n; ++i) { 
     new_array[i] = ptr[i]; 
    } 
    delete[] ptr; 
    return new_array; 
} 

это выделит память, скопировать поверх старого массива и возвращает указатель на массив, который в два раза превышает мощность старого.

+0

я изменил его к этому, и я все еще получаю утечку памяти: == 8065 == 40 байт в 1 блоках, безусловно, потеряли в потере записи 1 из 2 == 8065 == в 0x4A077FD оператор: новый [ ] (unsigned long) (в /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) == 8065 == by 0x400CB6: doubleArray (int *, int) (debug.cpp: 55) == 8065 = = by 0x400B58: main (debug.cpp: 34) == 8065 == == 8065 == LEAK SUMMARY: == 8065 == определенно потеряно: 40 байт в 1 блоке – Jon

+0

@Jon: избегайте такого рода памяти в первую очередь. Используйте 'std :: vector'. – GManNickG

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

  • Нет связанных вопросов^_^