【问题标题】:Using malloc in a constructor of a templated class在模板类的构造函数中使用 malloc
【发布时间】:2012-05-08 12:33:04
【问题描述】:

假设我有一个类将用于创建树或列表结构。让我们称之为

template <typename K, typename V>
class Node{
  // some data
  Node<K,V>* next;
  Node() {
    next = static_cast<Node<K,V>*>( malloc( sizeof(Node<K,V>) ));
  }
};

这样做会出现以下编译器错误:

'malloc' 没有依赖于模板的参数 参数,所以'malloc'的声明必须可用(如果你使用 '-fpermissive',G++ 将接受您的代码,但允许使用 不推荐使用未声明的名称)

有没有办法以这种方式使用 malloc 而不必使用已弃用的代码?我想使用 malloc 而不是 new 因为我想做一些更高级的内存管理。

【问题讨论】:

  • 这是一个不寻常的Node 类。您似乎是一个自动分配下一个节点的链表节点,在正常情况下会导致无限递归,但实际上您使用的是malloc,它不会调用您正在创建的对象的构造函数停止递归。我不确定这是否真的很聪明。
  • 你确定你不只是缺少包括 cstdlib 吗? (并说std::malloc?)
  • 听起来你没有包含声明 malloc 函数的 stdlib.h。

标签: c++ templates malloc


【解决方案1】:

您似乎缺少#include &lt;cstdlib&gt;#include &lt;stdlib.h&gt;。编译器抱怨缺少声明。这些包含文件提供一个。

【讨论】:

    【解决方案2】:

    编译器错误告诉您它没有声明 malloc 是什么。您缺少声明该函数的包含。

    除此之外,方法被打破了。您正在编写通用树,但由于使用了 malloc,您将使用限制为 POD 类型(我假设 KV 存储在 Node 中)。您应该使用 new 来代替它调用类型的构造函数,而不仅仅是分配内存。

    【讨论】:

    • 如果他使用new,那么他将导致无限递归。我不知道他是否故意使用malloc。他可能会在某处使用布置new,因此它不仅限于 POD 类型。
    • @SethCarnegie:确实如此,但我相信这是实现中的另一个错误...... :) 没有明智的方法来实现一个带有额外悬空节点的列表,@987654330 @ 不保证内存会被初始化,这反过来意味着您无法将 tail 与列表中的任何其他节点区分开来,并且您不知道在哪里停止跟踪节点。
    • 确实如此,但他本可以删除将其设置为 0 的部分。哦,好吧,奇怪的问题。世界永远不会知道。
    • 哦,对了,这只是包含的东西,愚蠢的我。 POD 类型对我来说已经足够了,因为我只想为我的算法和数据结构类创建一个具有良好记忆技巧的 SkipList。这里没有严肃的工程打算:)。谢谢你的帮助。并且构造函数中有一个错误,但我的意思只是询问 malloc 的事情。我只是写得太快了,因为我只想显示分配问题。对不起,我的匆忙。
    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2018-04-01
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多