Почему структуры, хранящие простые указатели на внутреннюю память, не могут храниться в контейнерах stxxl?

в 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 действует в течение всего срока действия программы.

2

Решение

(включая указатели) на внутреннюю память

Это означает указатель на член структуры или иным образом указатель на память, которой управляет контейнер. Например. у тебя есть

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

Foo f;
f.a = &f.b

поскольку f.a теперь указывает на член структуры, и эта структура может быть скопирована, указатель может быть недействительным. Аналогично, если указатель указывает на любую другую структуру Foo, управляемую контейнером, которую тоже можно перемещать.

Если у вас есть только указатель и вы управляете тем, на что он указывает, у вас все будет хорошо.

5

Другие решения

На реализациях с строгая безопасность указателя, тот факт, что вы сохранили указатель на диск, недостаточен. Если этот указатель больше не находится в памяти, объект, на который он указал, больше не действителен, даже если вы восстанавливаете биты указателя с диска. В частности, это может быть сборка мусора без запуска dtor.

1

Я предполагаю, что это потому, что данные в контейнерах копируются с использованием memcpy подход типа — так что если бы у вас был указатель внутри вашего класса, который вы сохраняли, вы бы скопировали указатель, а не данные, на которые указывают.

Когда вы сериализуете такую ​​структуру, указанные данные не будут сериализованы, только указатель. Когда вы восстановите данные, у вас будет указатель, чем указатель на мусор.

-1
По вопросам рекламы [email protected]