препятствование тому, чтобы данные были освобождены, когда вектор выходит из объема

В Google App Engine нет никакого хранения плоского файла. Все должно войти к Хранилище данных , который немного похож на реляционную базу данных, но не совсем.

Вы могли хранить файлы как TextProperty или атрибуты BlobProperty.

существует предел 1 МБ на записи DataStore, которые могут или не могут быть проблемой.

7
задан spirov 13 November 2009 в 20:19
поделиться

5 ответов

Простым обходным путем будет замена вектора на тот, который у вас есть:

vector<double> myown;

vector<double> someoneelses = foo();

std::swap( myown, someoneelses );

Более сложный, но, возможно, лучший подход - написать свой собственный распределитель для вектора и позволить ему выделить из пула вы поддерживать. Нет личного опыта, но это не так уж сложно.

7
ответ дан 6 December 2019 в 21:14
поделиться

Смысл использования std :: vector в том, чтобы не беспокоиться о данных в нем:

  • Сохраняйте вектор по всему приложению;
  • Передайте его с помощью const- ссылка на другие функции (чтобы избежать ненужных копий);
  • И передать функциям, ожидающим указатель на-T, с помощью & v [0] .

Если вы действительно не хотите сохранять свой вектор , вам придется скопировать свои данные - вы не можете передать право собственности, потому что std :: vector гарантирует, что он уничтожит свое содержимое при выходе из области видимости. В этом случае используйте алгоритм std :: copy () .

6
ответ дан 6 December 2019 в 21:14
поделиться

Если ваш вектор содержит значения, вы можете только копировать их (что происходит, когда вы вызываете std :: copy, std :: swap и т. д.). Если вы храните непримитивные объекты в векторе и не хотите их копировать (и использовать в другой структуре данных), подумайте о хранении указателей

1
ответ дан 6 December 2019 в 21:14
поделиться

У вас работает что-то подобное?

int main()
{
    double *data = 0;
    {
        vector<double> foo;
        // insert some elements to foo

        data = new double[foo.size()];
        std::copy(foo.begin(), foo.end(), &data[0]);
    }

    // Pass data to Matlab function.
    delete [] data;
    return 0;
}
0
ответ дан 6 December 2019 в 21:14
поделиться

Поскольку вы не хотите копировать данные между контейнерами, но хотите передать право собственности на данные между контейнерами, я предлагаю использовать контейнер интеллектуальных указателей следующим образом.

void f()
{
    std::vector<boost::shared_ptr<double> > doubles;
    InitVector(doubles);

    std::vector<boost::shared_ptr<double> > newDoubles(doubles);
}

Вы действительно можете ' • передавать право собственности на данные между стандартными контейнерами, не копируя их, поскольку стандартные контейнеры всегда копируют данные, которые они инкапсулируют. Если вы хотите минимизировать накладные расходы на копирование дорогостоящих объектов, то рекомендуется использовать умный указатель с подсчетом ссылок, чтобы обернуть вашу дорогостоящую структуру данных. boost :: shared_ptr подходит для этой задачи, так как сделать его копию довольно дешево.

-2
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: