如何使用新运算符 C++ 为 void 指针分配内存?
How to allocate memory for a void pointer using new operator C++?
所以我想做一个可以同时包含任何数据类型的链表。该列表包含元素对象:
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), 等等
撇开原因的问题不谈,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 };
}
};
另请参阅:Is it safe to delete a void pointer?
所以我想做一个可以同时包含任何数据类型的链表。该列表包含元素对象:
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), 等等
撇开原因的问题不谈,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 };
}
};
另请参阅:Is it safe to delete a void pointer?