LINUX.ORG.RU

История изменений

Исправление 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