История изменений
Исправление fsb4000, (текущая версия) :
можно ли вызывать realloc() для памяти выделенной посредством new в Си++?
Нет.
#include <cstdlib>
int main()
{
int* g = new int[2];
int* g1 = (int*)realloc(g, sizeof(int) * 3);
g1[2] = 0;
delete[]g1;
}
g++ -fsanitize=address -fsanitize=undefined -fsanitize=leak 1.cpp
==23133==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new [] vs free) on 0x60200000eff0
#0 0x7f93be1d3961 in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98961)
#1 0x400910 in main (/home/fsb4000/github/1/a.out+0x400910)
#2 0x7f93bd06b82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x400818 in _start (/home/fsb4000/github/1/a.out+0x400818)
0x60200000eff0 is located 0 bytes inside of 8-byte region [0x60200000eff0,0x60200000eff8)
allocated by thread T0 here:
#0 0x7f93be1d46b2 in operator new[](unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x996b2)
#1 0x4008f8 in main (/home/fsb4000/github/1/a.out+0x4008f8)
#2 0x7f93bd06b82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
SUMMARY: AddressSanitizer: alloc-dealloc-mismatch ??:0 realloc
Если изменить код так
#include <cstdlib>
int main()
{
int* g = new int[2];
int* g1 = (int*)realloc(g, sizeof(int) * 3);
g1[2] = 0;
//delete[]g1;
free(g1);
}
=================================================================
==23227==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new [] vs free) on 0x60200000eff0
#0 0x7fec48533961 in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98961)
#1 0x400910 in main (/home/fsb4000/github/1/a.out+0x400910)
#2 0x7fec473cb82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x400818 in _start (/home/fsb4000/github/1/a.out+0x400818)
0x60200000eff0 is located 0 bytes inside of 8-byte region [0x60200000eff0,0x60200000eff8)
allocated by thread T0 here:
#0 0x7fec485346b2 in operator new[](unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x996b2)
#1 0x4008f8 in main (/home/fsb4000/github/1/a.out+0x4008f8)
#2 0x7fec473cb82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
SUMMARY: AddressSanitizer: alloc-dealloc-mismatch ??:0 realloc
Исходная версия fsb4000, :
можно ли вызывать realloc() для памяти выделенной посредством new в Си++?
Нет.
#include <cstdlib>
int main()
{
int* g = new int[2];
int* g1 = (int*)realloc(g, sizeof(int) * 3);
g1[3] = 0;
delete[]g1;
}
g++ -fsanitize=address -fsanitize=undefined -fsanitize=leak 1.cpp
==23133==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new [] vs free) on 0x60200000eff0
#0 0x7f93be1d3961 in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98961)
#1 0x400910 in main (/home/fsb4000/github/1/a.out+0x400910)
#2 0x7f93bd06b82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x400818 in _start (/home/fsb4000/github/1/a.out+0x400818)
0x60200000eff0 is located 0 bytes inside of 8-byte region [0x60200000eff0,0x60200000eff8)
allocated by thread T0 here:
#0 0x7f93be1d46b2 in operator new[](unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x996b2)
#1 0x4008f8 in main (/home/fsb4000/github/1/a.out+0x4008f8)
#2 0x7f93bd06b82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
SUMMARY: AddressSanitizer: alloc-dealloc-mismatch ??:0 realloc
Если изменить код так
#include <cstdlib>
int main()
{
int* g = new int[2];
int* g1 = (int*)realloc(g, sizeof(int) * 3);
g1[3] = 0;
//delete[]g1;
free(g1);
}
=================================================================
==23227==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new [] vs free) on 0x60200000eff0
#0 0x7fec48533961 in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98961)
#1 0x400910 in main (/home/fsb4000/github/1/a.out+0x400910)
#2 0x7fec473cb82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x400818 in _start (/home/fsb4000/github/1/a.out+0x400818)
0x60200000eff0 is located 0 bytes inside of 8-byte region [0x60200000eff0,0x60200000eff8)
allocated by thread T0 here:
#0 0x7fec485346b2 in operator new[](unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x996b2)
#1 0x4008f8 in main (/home/fsb4000/github/1/a.out+0x4008f8)
#2 0x7fec473cb82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
SUMMARY: AddressSanitizer: alloc-dealloc-mismatch ??:0 realloc