sizeof(*a)
и sizeof(*b)
всегда будут равны 4. Кажется, вы ожидаете, что они вернут размер массивов, но вы должны понимать, что a
и b
не массивов.Они являются указателями на int
.Если sizeof(int)
равно 4, то sizeof(*a)
также будет равно 4, и это уже известно во время компиляции.
С учетом вышесказанного вам не нужно использовать функции библиотеки C malloc()
и calloc()
в C ++.Если вам нужно ручное выделение памяти, используйте new
и delete
:
a = new int;
b = new int[5];
Если вам нужно выполнить инициализацию нуля, как это делает calloc
, просто используйте ()
для построения по умолчанию выделенногоцелые числа:
a = new int();
b = new int[5]();
Вместо free()
используйте delete
или delete[]
, в зависимости от того, как new
был вызван ранее:
delete a; // Note: no '[]'
delete[] b; // Needs '[]'
Однако вы ненужно ручное распределение памяти здесь.Просто используйте std::vector<int>
:
#include <vector>
// ...
std::vector<int> a(5); // 5 int elements, zero-initialized.
std::cout << a.size() << '\n'; // Will print '5'.
Как правило, ваш код C ++ не должен вызывать new
, delete
, malloc()
, calloc()
или free()
.Ручное управление памятью требует больше кода и подвержено ошибкам.Вместо этого используйте контейнеры, такие как vector
, и интеллектуальные указатели, такие как shared_ptr
и unique_ptr
, чтобы уменьшить вероятность утечки памяти и других ресурсов.Эти более безопасные типы также более удобны.Например, с vector
вам не нужно запоминать размер выделенной памяти самостоятельно.vector
отслеживает его размер для вас.Вы также можете легко копировать векторы, просто назначая их напрямую.Вам также не нужно delete
или free()
векторов вручную.Они автоматически удаляются при выходе из области видимости.
В качестве дополнительного примечания я рекомендую избавиться от привычки использовать endl
для печати новых строк.endl
очищает поток, он не просто печатает новую строку.Если вы используете его, вы будете постоянно очищать поток вывода, что является медленной операцией.Вам редко нужно очищать поток, и в этом случае вы можете просто сделать это вручную с помощью << flush
, если необходимость когда-либо возникнет.