在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
的实例时,我可能会得到指向垃圾的指针。我知道。我保证指针在整个程序的整个生命周期内都是有效的。
答案 0 :(得分:5)
(包括指针)到内部存储器
这意味着指向结构成员的指针,或者指向容器管理的内存的指针。例如。你有
struct Foo {
int *a;
int b;
};
Foo f;
f.a = &f.b
由于f.a
现在指向结构的一个成员,并且该结构可以被复制,指针可能无效。类似的,如果指针指向容器管理的任何其他结构Foo,它也可以移动。
如果你只有一个指针,并管理它所指向的指针,你应该没问题。
答案 1 :(得分:1)
在使用严格指针安全的实现上,您保存指向磁盘的指针的事实是不够的。如果该指针不再在内存中,则它指向的对象不再有效 - 即使从磁盘恢复指针位也不行。特别是,它可能是垃圾收集而不运行任何dtor。
答案 2 :(得分:-1)
我想这是因为容器中的数据是使用memcpy
类型的方法复制的 - 所以如果你的类中有一个指针存储,你要复制指针而不是指针 - 数据。
当您序列化这样的结构时,指向的数据将不会被序列化,只会被指针化。当您恢复数据时,您将有一个指针而不是指向垃圾。