2020/07/01(Wed) 15:50:44 編集(投稿者)
オイラが思うに何をもって「メモリ消費量」を計測しているかで話は違うっす。
タスクマネージャのメモリ消費量をもってリークを判断しているとしたら、それは判断基準自体が誤り。
vector に限らず「メモリを解放」してもタスクマネージャのメモリ消費量は減らないことがある。
その辺が問題なく理解できているというなら下記を読む価値はあって
vector::size() と vector::capacity() の違いは理解してる?
世間一般的にいうメモリ消費量は capacity() のほう。
なので「メモリの解放」は capacity() を減らすことを言うっす。
(1-1) std::vector も寿命が尽きれば要素用のメモリとともに消去されるので
void func1(size_t n) {
std::vector<int> v(n);
...
}
別の関数がこの func() を呼び出して、呼び出し元に帰ってきたときにはメモリは解放されてる。
# 専門用語で「デストラクトされる」という
(1-2) std::vector 自体を new してるんなら delete が必要
void myclass_t::func2(size_t n) {
this->m_v = new std::vector<int>(n);
}
要するに class myclass_t { std::vector<int>* m_v; } であることを想定。
そうなら、この m_v はどこかで delete m_v; が必要で、なければリーク。
(オイラはこの書き方を推奨しない)
(2) vector::clear() では vector::capacity() は変化しないので「消費メモリ」は減らない仕様
つまりありとあらゆる vector で同じ挙動
int main() {
std::vector<int> v(100);
std::cout << v.size() << ':' << v.capacity() << std::endl;
v.clear();
std::cout << v.size() << ':' << v.capacity() << std::endl;
}
(3) vector の保持している全要素用のメモリがなくなるっす。
ただし、これが本当に必要か? と問われればまず 99% のケースでは不要。
C++11 以後なら vector::shrink_to_fit() のほうがわかりやすいっす。
https://cpprefjp.github.io/reference/vector/vector/shrink_to_fit.html
「本当にリークしているのか」今までの検証結果の妥当性の検証から。