2

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到 a中有什么问题stxxl::vector<S>?如果必须将 的特定实例S移动到磁盘,则a指针的值将写入磁盘。稍后,指针值被恢复,我可以使用它。显然,指针值也是机器相关和实例相关的,但即使我处理了指向对象的生命周期,这也是问题吗?我没有通过套接字发送序列化对象,也没有将序列化对象存储在数据库中以供以后使用。

我错过了什么吗?

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

4

3 回答 3

5

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

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

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

Foo f;
f.a = &f.b

由于f.anow 指向结构的成员,并且可以复制该结构,因此指针可能无效。类似地,如果指针指向由容器管理的任何其他结构 Foo - 也可以移动。

如果您只有一个指针,并管理它指向的内容,那么您应该没问题。

于 2014-02-24T14:42:19.920 回答
1

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

于 2014-11-27T12:26:37.940 回答
-1

我想这是因为容器中的数据是使用memcpy类型方法复制的 - 因此,如果您在要存储的类中有一个指针,那么您将复制指针而不是指向的数据。

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

于 2014-02-24T14:28:17.640 回答