【发布时间】: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:您如何能够与您不知道它们是什么类型的链接列表进行交互?你怎么知道哪些要转换回
int或double或char或其他什么? C++ 不是 C#;void*s don't know what they used to point to. -
我在 C 中比在 C++ 中更有意义。
标签: c++ pointers linked-list dynamic-memory-allocation void-pointers