Канонический способ удаления вектора, выделенного в куче в C ++ 17 - PullRequest
0 голосов
/ 18 марта 2020

Я искал переполнение стека, но кажется, что предыдущие ответы потенциально устарели или просто не очень ясны.

У меня следующий вопрос:

Я хочу хранить огромное количество данных в векторе. Для этого я выделю вектор в куче следующим образом:

#include <vector>
std::vector<int> *vector = new std::vector<int> (1000000000);

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

Какой канонический способ сделать это в c ++ 17?

Я знаю, что для массива рифф будет выглядеть следующим образом:

int *arr = new int[1000000000];
delete[] arr

Каков эквивалентный (и наиболее эффективный) способ сделать это для вектора stl?

1 Ответ

3 голосов
/ 18 марта 2020

С std::vector дело в том, что его данные всегда в куче.

Следовательно, вам не нужно выделять std::vector в куче.

std::vector использует принцип, называемый RAII (Resource Acquisition is Initialization), это означает, что когда он выполняется с памятью, он освобождает его для вас.

Следовательно, этого достаточно

{
std::vector<int> x{};
for (size_t i = 0; i < 50000; i++) x.push_back(x);
} // x gets out of scope, memory is freed

Вам не нужно вручную освобождать память std::vector.

Теперь, скажем, вы выделите саму std::vector в кучу по любой причине , Тогда вам придется использовать delete vector;, чтобы освободить его. В этом сценарии я бы предложил std::unique_ptr<std::vector<T>>, поскольку он также использует тот же принцип (RAII).

...