Код IT Загрузка примера кода…

C++ main.cpp
#include <iostream>
#include <memory>

class ManagedArray {
private:
    int* data;
    size_t size;

public:
    ManagedArray(size_t s) : size(s) {
        std::cout << "Выделение памяти под массив размером " << size << std::endl;
        data = new int[size];
        for (size_t i = 0; i < size; ++i) {
            data[i] = static_cast<int>(i);
        }
    }

    ~ManagedArray() {
        std::cout << "Освобождение памяти массива" << std::endl;
        delete[] data;
        data = nullptr;
    }

    // Запрет копирования (чтобы избежать двойного удаления)
    ManagedArray(const ManagedArray&) = delete;
    ManagedArray& operator=(const ManagedArray&) = delete;

    // Разрешение перемещения
    ManagedArray(ManagedArray&& other) noexcept : data(other.data), size(other.size) {
        other.data = nullptr;
        other.size = 0;
    }

    ManagedArray& operator=(ManagedArray&& other) noexcept {
        if (this != &other) {
            delete[] data;
            data = other.data;
            size = other.size;
            other.data = nullptr;
            other.size = 0;
        }
        return *this;
    }

    void print() const {
        std::cout << "Массив: ";
        for (size_t i = 0; i < size; ++i) {
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }
};

// Пример использования умного указателя (std::unique_ptr)
void useSmartPointer() {
    std::unique_ptr<ManagedArray> ptr(new ManagedArray(5));
    ptr->print();
    // Память освободится автоматически при выходе из области видимости
}

int main() {
    {
        ManagedArray arr(3);
        arr.print();
        // Деструктор вызывается здесь
    }

    useSmartPointer();
    // Деструктор вызывается здесь

    return 0;
}
#include <iostream>
#include <memory>

class ManagedArray {
private:
    int* data;
    size_t size;

public:
    ManagedArray(size_t s) : size(s) {
        std::cout << "Выделение памяти под массив размером " << size << std::endl;
        data = new int[size];
        for (size_t i = 0; i < size; ++i) {
            data[i] = static_cast<int>(i);
        }
    }

    ~ManagedArray() {
        std::cout << "Освобождение памяти массива" << std::endl;
        delete[] data;
        data = nullptr;
    }

    // Запрет копирования (чтобы избежать двойного удаления)
    ManagedArray(const ManagedArray&) = delete;
    ManagedArray& operator=(const ManagedArray&) = delete;

    // Разрешение перемещения
    ManagedArray(ManagedArray&& other) noexcept : data(other.data), size(other.size) {
        other.data = nullptr;
        other.size = 0;
    }

    ManagedArray& operator=(ManagedArray&& other) noexcept {
        if (this != &other) {
            delete[] data;
            data = other.data;
            size = other.size;
            other.data = nullptr;
            other.size = 0;
        }
        return *this;
    }

    void print() const {
        std::cout << "Массив: ";
        for (size_t i = 0; i < size; ++i) {
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }
};

// Пример использования умного указателя (std::unique_ptr)
void useSmartPointer() {
    std::unique_ptr<ManagedArray> ptr(new ManagedArray(5));
    ptr->print();
    // Память освободится автоматически при выходе из области видимости
}

int main() {
    {
        ManagedArray arr(3);
        arr.print();
        // Деструктор вызывается здесь
    }

    useSmartPointer();
    // Деструктор вызывается здесь

    return 0;
}