为什么不能将存储普通指针到内部存储器的结构存储在stxxl容器中?

时间:2014-02-24 14:22:45

标签: c++ pointers vector pod stxxl

stxxl常见问题解答中,我发现了这一点:

  

参数化STXXL容器

     

stxxl :: vector等STXXL容器类型只能参数化   值类型是POD(即没有虚函数,没有   用户定义的副本分配/析构函数等)和不包含   引用(包括指针)到内部内存。通常,“复杂”   数据类型不满足此要求。

     

这就是为什么stxxl::vector<std::vector<T> >和   stxxl::vector<stxxl::vector<T> >无效。如果合适,请使用   std::vector<stxxl::vector<T> >,或模拟二维数组   做指数计算。

无法使用stxxl::vector<std::vector<T> >非常有意义,因为stxxl容器在容器调整大小时不会调用包含元素的构造函数或析构函数。但是如何存储这样的结构:

struct S {
    int* a;
}

如果我确保只要a实例存在,stxxl::vector<S>指向的对象有效,那么将此struct存储到stxxl::vector<S>中会出现什么问题?如果必须将S的特定实例移动到磁盘,则a指针的值将写入磁盘。稍后,指针值将恢复,我可以使用它。显然,指针值也依赖于机器和依赖于实例,但这是的问题,即使我负责指向对象的生命周期?我没有通过套接字发送序列化对象,我没有将序列化对象存储在数据库中供以后使用。

我错过了什么吗?

编辑:有人提醒我stxxl不会复制指针对象,因此当我稍后检索struct S的实例时,我可能会得到指向垃圾的指针。我知道。我保证指针在整个程序的整个生命周期内都是有效的。

3 个答案:

答案 0 :(得分:5)

  

(包括指针)到内部存储器

这意味着指向结构成员的指针,或者指向容器管理的内存的指针。例如。你有

struct Foo {
     int *a;
     int b;
};

Foo f;
f.a = &f.b

由于f.a现在指向结构的一个成员,并且该结构可以被复制,指针可能无效。类似的,如果指针指向容器管理的任何其他结构Foo,它也可以移动。

如果你只有一个指针,并管理它所指向的指针,你应该没问题。

答案 1 :(得分:1)

在使用严格指针安全的实现上,您保存指向磁盘的指针的事实是不够的。如果该指针不再在内存中,则它指向的对象不再有效 - 即使从磁盘恢复指针位也不行。特别是,它可能是垃圾收集而不运行任何dtor。

答案 2 :(得分:-1)

我想这是因为容器中的数据是使用memcpy类型的方法复制的 - 所以如果你的类中有一个指针存储,你要复制指针而不是指针 - 数据。

当您序列化这样的结构时,指向的数据将不会被序列化,只会被指针化。当您恢复数据时,您将有一个指针而不是指向垃圾。