Có nên dùng hàm realloc trong c++?

Chào mọi người, cho mình hỏi trong C++ có nên sử dụng hàm realloc không ạ, nếu không thì tại sao.
vì mình code 2 kiểu dưới đây trong c++ cho kết quả như nhau:

void Them_Bot_Vung_Nho_Mang(int *&a, int Vung_Nho_Moi, int Vung_Nho_Cu)
{
    a = (int *)realloc(a, Vung_Nho_Moi * sizeof(int));
}
void Them_Bot_Vung_Nho_Mang(int *&a, int Vung_Nho_Moi)
{
    int *b = new int[Vung_Nho_Cu];
    for (int i = 0; i < Vung_Nho_Cu; i++)
    {
        b[i] = a[i];
    }
    delete[] a;
    a = new int[Vung_Nho_Moi];
    for (int i = 0; i < Vung_Nho_Moi; i++)
    {
        a[i] = b[i];
    }
    delete[] b;
}

Nên vì dùng hàm có sẵn đọc dễ hiểu hơn :smiley:
Với lại realloc có thể ko cần cấp phát lại vì vẫn còn chỗ. Kích thước cấp phát thực ra sẽ lớn hơn kích thước truyền vào lệnh alloc do dùng số chẵn thì dễ quản lí heap hơn.

2 Likes

hmmm, nên dùng à, vì đây là hàm bên C. mình học qua youtube thầy lại bảo ko nên dùng. chả biết sao nữa. zz

Do realloc (malloc…) không kích hoạt constructor và không gán vtable nên chỉ dùng cho primitive và Plain Old Structs.

2 Likes

Là như nào bác ơi, e còn chưa học tới mấy cái này, chưa hiểu bác nói gì :|.

C++ xài malloc/realloc cũng được, nhưng khi xóa phải xài free gọi destructor (dtor) cho từng phần tử trong mảng đó :V Nếu kiểu dữ liệu ko có dtor thì ko cần gọi dtor cho từng phần tử, vd như các kiểu dữ liệu int, char, double v.v… (gọi là primative types) hoặc các struct/class ko có dtor.

nói “ko có dtor” là nói đơn giản, ko chính xác lắm :V Nói chính xác là kiểu plain old data (POD) :V có thể kiểm tra bằng std::is_pod<kiểu dữ liệu>::value hoặc hiện đại hơn :V :V là std::is_trivial_v<T>std::is_standard_layout_v<T>

vì rắc rối như vậy nên thầy bảo ko nên dùng malloc/realloc trong C++ cũng đúng :V Tốt hơn nữa là ko nên dùng new/delete luôn =]]

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?