c++ - 如何使用新运算符 C++ 为 void 指针分配内存?

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

所以我想做一个可以同时包含任何数据类型的链表。该列表包含元素对象:

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

最佳答案

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

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?

关于c++ - 如何使用新运算符 C++ 为 void 指针分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316702/

相关文章:

c++ - OpenCV Eclipse CDT

c++ - 放置新的,按值返回并安全地处理临时拷贝

c - 指针未给出 c 中的预期输出

c - 在c开头添加节点

创建一个包含 BST 给定范围内数字的单向链表

c++ - Arduino 的替代 IDE

c++ - 链接器错误 : undefined symbol

c - 使用结构体指针的两个函数(读取和显示数组)

c - 如何在c编程中检查空指针,得到这个编译错误: used struct type value where scalar is required ,

c - 删除c中的链表