【问题标题】:Is it safe to use the "realloc" after the "new" operator in C++? [duplicate]在 C++ 中的“new”运算符之后使用“realloc”是否安全? [复制]
【发布时间】:2018-12-17 05:59:02
【问题描述】:

据我所知,C++ 中的 reallocC 没有确切的替代方案,就像 new 中的 malloc 一样。但是,当我在C++ 中使用realloc 来更改new 运算符分配的内存时,它可以正常工作。

像我在下面的代码中那样使用这两个(newrealloc)是否安全,否则会导致一些问题?

#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[] of free()

【问题讨论】:

  • 无,改用std::vector
  • 运行时库不会故意让这个失败。然而,当元素类型是 C++ 对象(如 std::string)时,它会燃烧 UB。内部指针不会更新。
  • @HansPassant 为什么会有人用std::string 来做这件事?或者确实是任何类型的库对象?一切都会失去,没有收获(除非你完全误解了std::vectorstd::array)。
  • 而且,有趣的是,因为 newmalloc 从不同的堆分配,“编辑 n 继续”在 VS2015 中不起作用,我认为是,因为 - 正如我在展会后发现的那样一点点挖掘——一些东西被分配给malloc,后来被delete释放。我修补了mspdsrv 并以我的快乐方式航行(后来修复了)。具有讽刺意味的是,这个 bug 被一些无效的参数处理逻辑“吞噬”了,所以制作这个 boo-boo 的开发人员从未看到任何证据(除了他的代码实际上没有工作的事实)。

标签: c++ realloc


【解决方案1】:

不,行为是未定义。您只能在从调用 new[] 获得的指针上调用 delete[]

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

【讨论】:

  • documentation of realloc says:重新分配给定的内存区域。它必须事先由 malloc()、calloc() 或 realloc() 分配,并且尚未通过调用 free 或 realloc 释放。否则,结果未定义。
【解决方案2】:

不安全。 new 只能与 deletedelete[] 匹配 - 将其与 realloc 一起使用是危险的,可能会导致安全风险。

另外,你为什么首先使用newdelete?如果您真的想自己管理内存,请使用std::vector 之类的容器或std::unique_ptr 之类的智能指针。

【讨论】:

    【解决方案3】:

    不要将 c 内存函数与 c++ 内存函数混用,否则会很糟糕。

    看到这个: What is C++ version of realloc(), to allocate the new buffer and copy the contents from the old one?

    【讨论】:

    • 这个答案应该是评论
    猜你喜欢
    • 2016-02-12
    • 2012-02-22
    • 2019-07-04
    • 2011-05-05
    • 2013-08-24
    • 2017-07-21
    • 2017-12-22
    • 2017-07-29
    • 2011-12-06
    相关资源
    最近更新 更多