2015-02-11 16 views
5

Wiem, że newdelete są niezgodne z mallocfree.Czy można bezpiecznie przekazywać pamięć przydzieloną przy użyciu "new" do bibliotek C?

Czy to oznacza, że ​​należy unikać korzystania z new dla pamięci, która będzie używana przez bibliotekę C?

Jakie rzeczy mogą się nie udać podczas używania new zamiast malloc, kiedy przekazuję pamięć do biblioteki C?

void func() 
{ 
    int *p = new int(42); 

    // Should I insist on using malloc for p if this function is a part 
    // of a C library? 
    lib_func(p); 
} 

Odpowiedz

11

Pamięć jest pamięcią i nie ma znaczenia, w jaki sposób została przydzielona.

Dopóki jesteś dopasowanie new z delete, new[] z delete[] i malloc/calloc z free (także realloc), jesteś w porządku.

Jeśli myślisz o tym, nawet C przydziela pamięć w różnych miejscach i działa dobrze - jeśli biblioteka oczekuje, że jest to int, możesz ją przydzielić na stosie lub na stercie (lub w niektórych globalnych przechowywanie):

int a; 
int* b = malloc(sizeof(int)); 
static int c; 

some_func(&a); 
some_func(b); 
some_func(&c); 
+0

@ PM100 to doskonale dobrze zdefiniowane. Wszystko, co jest wymagane przez standardy, to to, co tu jest napisane. W przepełnieniu stosu nie dostarczamy odpowiedzi "oczywiście to po prostu działa". Zapewnienie, że jest to naprawdę bardzo niegrzeczne. –

+0

tak, że jakaś część standardu C++ mówi, że wynik nowego jest identyczny z wynikiem malloc (poza efektem wywołania konstruktora) – pm100

+0

@ pm100: W pewnym sensie tak. Jest w tej samej przestrzeni pamięci (o czym świadczy fakt, że zarówno 'new' jak i' malloc' mogą tworzyć wskaźniki typu 'T *'). –

8

Czy to znaczy, że należy unikać nowe dla pamięci, który będzie używany przez bibliotekę C?

Wcale nie. Pamięć jest taka sama, więc jeśli zapewnisz bezpieczny sposób na zwolnienie pamięci, możesz z pewnością przekazać tę pamięć do biblioteki C.

int *p = new int(42); 
lib_func(p); 
delete p; 

Oto kolejny przykład:

extern "C" { 
    int* make_buffer(size_t sz) { 
     return new int[sz]; 
    } 
    void use_buffer(int* buf) { 
     ... // do something 
    } 
    void free_buffer(int* buf) { 
     delete[] buf; 
    } 
} 

Powyższy kod pozwala Twój Żądanie kodu C dynamicznie przydzielane pamięci z biblioteki C++.

4

Jest to pamięć tak jak każda inna, więc jest bezpieczna, o ile biblioteka C nie jest w niej free.

Należy zauważyć, że w przykładzie, można również korzystać z pamięci na stosie, który nie ma funkcji alokacji lub dealokacji:

void func() 
{ 
    int p; 
    lib_func(&p); 
} 
Powiązane problemy