【问题标题】:How to allocate memory for a void pointer using new operator C++?如何使用新运算符 C++ 为 void 指针分配内存?
【发布时间】:2026-02-09 21:30:22
【问题描述】:

所以我正在尝试制作一个可以同时包含任何数据类型的链表。该列表包含 Element 对象:

struct Element {
  void* data;
  Element* next;

  Element(const void* content, Element* next_ele) {
    next = next_ele;
    data = new void;  // this doesn't work
    (*data) = (*content)
  }
};

我必须为data分配内存的原因是因为如果我只是分配data = content,如果*content被销毁(例如离开本地函数时),*data也会被销毁。这意味着如果我在函数内的列表中添加一些元素,当函数退出时,这些元素将从列表中消失。示例如下:

// in List.cpp
List::add(void *content) {
    // for this question, ignore the case when list is empty 
    Element *ele = new Element(content, nullptr); 
    last.next = ele
    last = ele
}


// main.cpp
List myList;

void addEle() {
    int a; double b; char c;
    myList.add(&a); myList.add(&b); myList.add(&c);
}

int main()
{
    myList = newList();
    addEle();
}

当 addEle() 退出时,变量 a, b, c 不再存在。所以列表的内容是无稽之谈。

那么如何在 C++ 中分配 void 类型的内存来解决这个问题呢?如果我不能,是否有任何解决方案(模板除外),以便当我离开本地函数时,列表的内容不会改变?

感谢您的帮助。

编辑 1:我不能使用模板,因为使用模板意味着每个列表对象只能包含 1 种数据类型。但我想做一些类似 myList.add(1)、myList.add(3.5)、myList.add('c')、myList.add(student) 等的事情

【问题讨论】:

  • 为什么不用模板而不是空指针?
  • new void 没有声明一个新的 void 指针。
  • 使用void 会做什么?你没看到what it did to Fantasia吗?
  • @user3192711:您如何能够与您不知道它们是什么类型的链接列表进行交互?你怎么知道哪些要转换回intdoublechar或其他什么? C++ 不是 C#; void*s don't know what they used to point to.
  • 我在 C 中比在 C++ 中更有意义。

标签: c++ pointers linked-list dynamic-memory-allocation void-pointers


【解决方案1】:

模板是您正在寻找的解决方案。你可以用这种方式存储任何类型:

struct Element {
  void* data;
  Element* next;

  template <typename T>
  Element(const T* content, Element* next_ele) {
    next = next_ele;
    data = new T{ *content };
  }
};

另见:Is it safe to delete a void pointer?

【讨论】:

  • 问题是提问者不能在不添加其他技巧的情况下将As 与B 粘贴在同一列表中。提问者将如何从Bs 中分辨出As,如果我知道的话,我会很高兴,但是,嘿。我不必调试它。
  • @user4581301 你的意思是他们将如何取消引用列表中的指针?我不知道,他们没有在问题中问这个问题。他们还必须找到调用析构函数的方法,因为删除void * 不会调用析构函数。
  • 从 cmets 看来,似乎没有实际理由这样做,因为无论如何我都没有办法取消引用它们。我问这个问题是为了学习“如何”,但我想正确的答案是“一开始就不要这样做”。谢谢大家!
  • @user3192711 std::vector&lt;std::any&gt;std::list&lt;std::any&gt; 是最接近标准库的 Python 列表。但即便如此,您也必须找到一种方法来存储类型信息以使用std::any_cast。你可能只需要std::tuple
【解决方案2】:

暂且不说为什么,std::any 似乎是您正在寻找的解决方案。

#include<any>

struct A
{
    std::any data;
    A() = default;
};


int main()
{
    A a;
    a.data = "Hello World\n";
    a.data = 1;
    a.data = 2.5f;
    a.data = 'B';
}

【讨论】:

  • 不幸的是,std::any 是 C++17 的特性,不适用于 C++14 :(
  • 总是有 boost::any