在STL容器中存储指向堆对象的指针,以便以后重新分配

rit*_*ter 1 c++ stl cuda c++11

如何在STL容器中存储任意数量的动态创建的实例(不同类型),以便以后只有容器可以释放内存?

它应该像这样工作:

std::vector< void * > vec;
vec.push_back( new int(10) );
vec.push_back( new float(1.) );
Run Code Online (Sandbox Code Playgroud)

现在,如果vec超出范围,则会破坏指向实例的指针,但不会释放内存int和for float.显然我做不到:

for( auto i : vec )
  delete *i;
Run Code Online (Sandbox Code Playgroud)

因为void*它不是指向对象的指针类型.

您可以反对并争辩说这不是一个好主意,因为无法访问向量的元素.这是对的,我自己也不会访问它们.NVIDIA驱动程序将访问它们,因为它只需要地址(void*很好)它的内核调用参数.

我想这里的问题是它可以是存储的不同类型.想知道如果一个union人想要将这个作为参数传递给cuda内核,是否可以做到这一点.

内核接受不同类型的参数,并通过遍历表达树(表达式模板)来收集,而表达式树(表达式模板)预先不知道类型.因此,在访问叶子时,您将存储参数.它只能是void*,内置类型为int,float等.

可以在内核启动后立即删除该向量(启动是异步的,但驱动程序先复制参数然后继续主机线程).第二个问题:每个参数都向驱动程序传递一个void*.无论是int,float还是void*.所以我猜一个人可以分配比所需更多的内存.我认为联盟的东西可能值得一看.

Che*_*Alf 5

您可以使用要支持的每种类型的一个向量.

虽然这对于矢量的概念有很大的改进void*,但它仍然非常臭.

这听起来像一个XY问题:你有一个问题X,你想象一个解决方案Y,但是如果没有某种巧妙的适应性,Y显然是行不通的,所以问一下Y.相反,应该询问真正的问题X.这是哪个?