次の問題があります:
ビルトインで std::vector を使用するとメモリが得られませんが、クラスを使用するとメモリリークが発生します。説明する:
//No leak
std::vector<double>* vecPtr1=new std::vector<double>();
//add some elements
delete vecPtr1;
//Leaks some memory but not all
std::vector<SomeClass>* vecPtr2=new std::vector<SomeClass>();
//add some elements with vecPtr2->push_back(SomeClass());
delete vecPtr2;
私が理解している限り、delete は std::vector のデストラクタを呼び出す必要があり、次に SomeClass のデストラクタを呼び出す必要があります -> リークはありません。これにいくつかの考えとテストを投資しましたが、次のようなスコープで std::vector を使用すると同じ動作が発生します。
{
std::vector<SomeClass> vector;
//add elements as before
}
//memory is still used here
Ubuntu 11.10 で gcc 4.6.1 を使用しています。私のライブラリに何か問題がありますか、それとも std::vector が要素を破壊する方法を誤解していますか?
明確にするために、SomeClass を std::pair に置き換えた完全なコードを示します (はい、いくつかの部分がハッキングされていることは知っていますが、これは単なる例です)。
#include <iostream>
#include <vector>
#include <utility>
int main()
{
std::string inString;
std::cout<<"Started"<<std::endl;
//wait
std::cin>>inString;
{
//assign vector
std::vector<std::pair<std::string,unsigned int> > vec=std::vector<std::pair<std::string,unsigned int> >();
//push elements
for(unsigned int i=0;i<1e7;++i)
{
vec.push_back(std::pair<std::string,unsigned int>("something",i));
}
std::cout<<"Created vector with capacity: "<<vec.capacity()<<std::endl;
//wait
std::cin>>inString;
}
//vec should go out of scope but not all memory gets freed
std::cout<<"Deleted vector"<<std::endl;
//wait
std::cin>>inString;
std::cout<<"Shutting down"<<std::endl;
return 0;
}