为什么存储指向内部内存的纯指针的结构不能存储在stxxl容器中

Why cannot structs storing plain pointers to internal memory be stored in stxxl containers?

本文关键字:存储 不能 stxxl 结构 内部 内存 为什么 指针      更新时间:2023-10-16

stxxl常见问题解答中,我发现了以下内容:

STXXL集装箱参数化

STXXL容器类型(如STXXL::vector)只能参数化值类型为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;
}

如果我保证只要stxxl::vector<S>实例存在,a指向的对象就有效,那么将这个struct存储到stxxl::vector<S>中有什么问题?如果必须将S的特定实例移动到磁盘,则a指针的值将写入磁盘。稍后,指针值被恢复,我可以使用它。很明显,指针值也依赖于机器和实例,但这是一个问题吗?我不是通过套接字发送序列化对象,也不是将序列化对象存储在数据库中以备将来使用。

我是不是错过了什么?

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

(包括指针)到内部内存

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

struct Foo {
int *a;
int b;
};
Foo f;
f.a = &f.b

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

如果你只是有一个指针,并管理它指向的内容,你应该没事。

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

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

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