代码之家  ›  专栏  ›  技术社区  ›  L_J

使用C++中的“新”操作符后使用“ReloLc”是否安全?[副本]

  •  -2
  • L_J  · 技术社区  · 6 年前

    这个问题已经有了答案:

    据我所知,对于 realloc 属于 C 在里面 C++ 就像 new 对于 malloc 是的。但是,当我使用 雷洛克 在里面 C++ 更改 接线员,工作正常。

    用这两个安全吗( 雷洛克 )就像我在下面的代码中做的那样,否则会导致一些问题?

    #include <iostream>
    #include <cstdlib>
    
    int main()
    {
        int size = 5;
        int * arr = new int[size]{ 1,3,5,7,9 };
    
        for (int i = 0; i < size; i++)
            std::cout << *(arr + i) << (i < size - 1 ? ' ' : '\n');
    
        size++;
        arr = (int*)realloc(arr, size * sizeof(int));
    
        *(arr + size - 1) = 11;
        for (int i = 0; i < size; i++)
            std::cout << *(arr + i) << (i < size - 1 ? ' ' : '\n');
    
        delete[] arr;
        //free(arr);
    
        std::cin.get();
        return 0;
    }
    

    另外,在这种情况下,我应该使用哪个运算符来释放内存: delete[] 属于 free() 是吗?

    3 回复  |  直到 6 年前
        1
  •  5
  •   George    6 年前

    不,行为是 未定义 是的。你只能打电话 delete[] 在从调用中获取的指针上 new[] 是的。

    使用 std::vector 会导致所有这些记忆问题消失。

        2
  •  3
  •   Vittorio Romeo    6 年前

    这不安全。 new 只有 delete delete[] -与一起使用 realloc 是危险的,可能导致安全风险。

    还有,你为什么要用 新的 删除 首先呢?使用容器,如 std::vector 或智能指针,如 std::unique_ptr 如果你真的想自己管理记忆。

        3
  •  0
  •   Hongyu Wang    6 年前

    不要把C内存函数和C++内存函数混在一起,否则你会玩得很不愉快。

    请参阅: What is C++ version of realloc(), to allocate the new buffer and copy the contents from the old one?