в stxxl
FAQ, я нашел это:
Параметризация контейнеров 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;
}
Если я гарантирую, что объект, указанный a
действует до тех пор, пока stxxl::vector<S>
экземпляр существует, что проблема в хранении этого struct
в stxxl::vector<S>
? Если конкретный случай S
должен быть перемещен на диск, затем значение a
указатель написан на диске. Позже значение указателя восстанавливается, и я могу его использовать. Очевидно, значение указателя зависит от машины и экземпляра, но это вопрос даже если Я забочусь о времени жизни указанного объекта? Я не отправляю сериализованный объект через сокет и не храню сериализованный объект в базе данных для последующего использования.
Я что-то пропустил?
РЕДАКТИРОВАТЬ: кто-то напомнил мне, что stxxl
не копирует pointee, и поэтому я могу получить указатель на мусор, когда я получаю экземпляр struct S
позже. Я знаю это. Я гарантирую, что pointee действует в течение всего срока действия программы.
(включая указатели) на внутреннюю память
Это означает указатель на член структуры или иным образом указатель на память, которой управляет контейнер. Например. у тебя есть
struct Foo {
int *a;
int b;
};
Foo f;
f.a = &f.b
поскольку f.a
теперь указывает на член структуры, и эта структура может быть скопирована, указатель может быть недействительным. Аналогично, если указатель указывает на любую другую структуру Foo, управляемую контейнером, которую тоже можно перемещать.
Если у вас есть только указатель и вы управляете тем, на что он указывает, у вас все будет хорошо.
На реализациях с строгая безопасность указателя, тот факт, что вы сохранили указатель на диск, недостаточен. Если этот указатель больше не находится в памяти, объект, на который он указал, больше не действителен, даже если вы восстанавливаете биты указателя с диска. В частности, это может быть сборка мусора без запуска dtor.
Я предполагаю, что это потому, что данные в контейнерах копируются с использованием memcpy
подход типа — так что если бы у вас был указатель внутри вашего класса, который вы сохраняли, вы бы скопировали указатель, а не данные, на которые указывают.
Когда вы сериализуете такую структуру, указанные данные не будут сериализованы, только указатель. Когда вы восстановите данные, у вас будет указатель, чем указатель на мусор.