【问题标题】:Can a double pointer use both malloc/free and new/delete?双指针可以同时使用 malloc/free 和 new/delete 吗?
【发布时间】:2016-04-28 11:37:50
【问题描述】:

我想知道我是否有一个类“Object”,然后我想创建一个 ObjectList - Object** p_obj。那么我可以 malloc/free 为 p_obj 和 new/delete 为 p_obj[i] 吗?

类似:

    p_obj = (Object**) malloc(sizeof(Object*) * count_obj)
    p_obj[0] = new Object();

并在析构函数中使用 delete 和 free 释放它们; 如果可以,那么它可能会导致哪些潜在问题?

提前致谢。

【问题讨论】:

  • C 和 C++ 是不同的语言。同时拥有两个标签几乎总是不正确的。由于您显然在使用 C++ (new),请删除 C 标记。
  • 没有理由不能。你同样可以做到Object o; p_obj = new Object*[1]; p_obj[0] = &o; - “混合”自动和动态分配。
  • @Revolver_Ocelot thx,我已经解决了。
  • 释义 Stroustrup:如果你的代码有 deletedelete[],你可能有一个错误。如果它有一个赤裸裸的newnew[],它应该有一个deletedelete[],见第一句。因此,只需使用容器和自动对象,如果需要(很少)使用智能指针。
  • 所以 tl;dr:使用 std::vector<Object>,忘记 new[]malloc。两者都会产生糟糕的代码。

标签: c++


【解决方案1】:

从技术上讲,这是合法的,但您为什么要这样做?使用new 处理所有内容。

它可能导致什么潜在问题?

不小心使用了错误的释放。 仅仅正确完成动态内存处理并不容易。如果你会增加复杂性......

【讨论】:

  • 在 c++ 中使用 malloc 的一个可能原因是,当您希望在不复制元素的情况下选择重新调整分配大小(使用 realloc)时。
  • @SHR 是的,你说得对,如果列表已满,我想重新调整大小。但是对于 p_item[i] 仍然使用 malloc 是很乏味的。这就是为什么会出现这个问题。
【解决方案2】:

虽然这在技术上没有“错误”,但它肯定违反了 C++ 范式。

你最终会遇到的最大问题是你会给自己和其他必须维护代码的人造成混乱。

作为一般规则,在 C++ 中使用 new/delete 而不是 malloc/free。对于奖励积分,请使用智能指针,并且永远不要直接处理对象分配或取消分配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多