为什么存储指向内部内存的纯指针的结构不能存储在stxxl容器中
Why cannot structs storing plain pointers to internal memory be stored in stxxl containers?
在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
类型的方法复制的,所以如果您在存储的类中有一个指针,那么您将复制指针,而不是指向的数据。
当您串行化这样的结构时,指向的数据将不会串行化,只有指针。当您恢复数据时,您将有一个指向垃圾的指针。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- 流的奇怪问题.不能存储具有特定值的成员变量的对象
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- 为什么使用预留分配存储后不能迭代和打印矢量的内容?
- 为什么我不能将对象存储在unordered_set中?
- 不能存储太长的 int 类型
- 为什么存储指向内部内存的纯指针的结构不能存储在stxxl容器中
- 显式模板专用化不能具有存储类 - 成员方法专用化
- 为什么我不能在SERVICE_TABLE_ENTRY中存储 lambda 函数?
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么
- 整型变量不能存储大的值
- 静态函数:这里不能指定存储类
- 为什么我的 64 位计算机不能在 C++ 中存储双精度数字 2^1024?
- 在不能存储值的情况下计算序列
- QPixmap不能使用存储在变量中的图像路径
- 为什么我们不能总是在 C 中使用寄存器存储类?