< 所有主题
打印

7.1指针动态内存演示

C风格 malloc/free,C++裸指针 new/delete,现代 C++ make_unique / (自动释放)

演示视频 :https://www.bilibili.com/video/BV1ezAbzFENq/

#include <cstdlib> // for malloc/free
#include <cstring> // for memset
#include <memory>  // for std::unique_ptr
#include <iostream>

/**
 * 练习:学习C指针malloc/free,C++裸指针new/delete,  现代智能指针
 * C 风格: malloc -> ... -> free
 * C++ 裸指针: new -> ... -> delete
 * 现代 C++: make_unique -> ... -> (自动释放)
 */
int main()
{
#ifdef _WIN32
    // Windows 平台下,设置控制台输出编码为 UTF-8
    system("chcp 65001 > nul");
#endif

    // C 风格: malloc -> ... -> free
    int *p_c = (int *)malloc(sizeof(int));
    if (p_c != NULL)
    {
        *p_c = 42;
        free(p_c);
        p_c = NULL; // 释放后置空
    }

    int *arr_c = (int *)malloc(10 * sizeof(int));
    if (arr_c != NULL)
    {
        memset(arr_c, 0, 10 * sizeof(int)); // 清零
        for (int i = 0; i < 10; ++i)
        {
            *(arr_c + i) = i * 10; // 赋值
        }
        free(arr_c);
        arr_c = NULL; // 释放后置空
    }

    // C++ 裸指针: new -> ... -> delete
    int *p_cpp = new int(42);
    delete p_cpp;
    p_cpp = nullptr; // 释放后置空

    int *arr_cpp = new int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    delete[] arr_cpp;
    arr_cpp = nullptr; // 释放后置空

    // 现代 C++: make_unique -> ... -> (自动释放)
    // 使用 std::unique_ptr 管理动态数组,无需手动 delete
    std::unique_ptr<int[]> arr_unique = std::make_unique<int[]>(10);
    // 赋值
    for (int i = 0; i < 10; ++i)
    {
        arr_unique[i] = i * 10;
    }
    // 访问(示例)
    for (int i = 0; i < 10; ++i)
    {
        std::cout << arr_unique[i] << " ";
    }
    std::cout << std::endl;
    // 离开作用域时 arr_unique 自动释放内存,无需手动调用 delete[]

    return 0;
}
目录