Указатели и память

Корректное использование const

const документирует отсутствие изменений и позволяет компилятору блокировать запись.

Что такое Корректное использование const?

const документирует отсутствие изменений и позволяет компилятору блокировать запись.

Точно выражайте данные только для чтения и изменяемые указатели.

Важные моменты

  • Указатель ссылается на живой совместимый объект или равен null.
  • Каждое собственное выделение освобождается ровно один раз.
  • Явно выражайте ownership и const.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

int sum(const int *values, size_t count) {
    int total = 0;
    for (size_t i = 0; i < count; ++i) total += values[i];
    return total;
}

int main(void) {
    const int values[] = {2, 4, 6};
    printf("%d\n", sum(values, 3));
    return 0;
}
Ожидаемый результат
12
C++
Запустить →
main.cpp
#include <array>
#include <iostream>

int sum(const std::array<int, 3>& values) {
    int total = 0;
    for (int value : values) total += value;
    return total;
}

int main() {
    const std::array values{2, 4, 6};
    std::cout << sum(values) << '\n';
}
Ожидаемый результат
12

Сравнение C и C++

Pointer-to-const защищает значение, const pointer не меняет адрес. В C++ есть const member functions.

C

Ownership и очистка — соглашения, контролируемые программистом.

C++

Контейнеры и RAII связывают ownership и очистку с lifetime объекта.

Практические задания

Запустите обе версии и изменяйте их, сравнивая гарантии языков.

  • Проверьте null и отказ выделения памяти.
  • Используйте AddressSanitizer и UndefinedBehaviorSanitizer.
  • Документируйте ownership каждого указателя.