【发布时间】:2012-10-31 15:53:22
【问题描述】:
如何在一个 STL 容器中存储任意数量的(不同类型的)动态创建的实例,以便以后只有容器才能释放内存?
它应该像这样工作:
std::vector< void * > vec;
vec.push_back( new int(10) );
vec.push_back( new float(1.) );
现在,如果vec 超出范围,则指向实例的指针将被破坏,但不会释放int 和float 的内存。显然我做不到:
for( auto i : vec )
delete *i;
因为void* 不是指向对象的类型。
您可以反对并争辩说这不是一个好主意,因为无法访问向量的元素。没错,我自己也不会访问它们。 NVIDIA 驱动程序将访问它们,因为它只需要地址(void* 很好)作为内核调用的参数。
我想这里的问题是它可以存储不同的类型。想知道union 是否可以解决问题,以防有人想将其作为参数传递给 cuda 内核。
内核采用不同类型的参数,并通过遍历您事先不知道类型的表达式树(表达式模板)来收集。因此,在访问叶子时,您将存储参数。只能是 void*,以及内置类型 int、float 等。
可以在内核启动后立即删除向量(启动是异步的,但驱动程序首先复制参数然后继续主机线程)。第二个问题:每个参数都传递一个 void* 给驱动程序。无论它是 int、float 还是 void*。所以我想一个人可以分配比需要更多的内存。我认为工会的东西可能值得一看。
【问题讨论】:
-
你为什么需要这么疯狂的设计?只需使用
vector<float>和vector<int>。如果您不知道它指向的对象的类型,void *有什么用? -
里面的类型是否有限?
-
内核接受不同类型的参数,通过遍历事先不知道类型的表达式树(表达式模板)来收集。因此,在访问叶子时,您将存储参数。可能是
int、float等 -
@Caribou 是的,只能是
void*,以及内置类型int、float等 -
你能不能 malloc 它,然后释放它,然后在新的地方而不是直接新建和删除?