繁体   English   中英

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

[英]How to allocate memory for a void pointer using new operator C++?

所以我试图制作一个可以同时包含任何数据类型的链表。 该列表包含 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) 等的事情

撇开为什么的问题不谈, 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';
}

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

struct Element {
  void* data;
  Element* next;

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

另请参阅:删除空指针是否安全?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM