Troubleshooting
Problem
[Japanese] 本技術情報は、IBM® Rational® Test RealTime™ で GNU C++ ライブラリにて実装された STL コンテナクラス (vector、list等) を使用すると、コンテナオブジェクトがクリアされているにもかかわらず、メモリリークがレポートされる現象について説明します。
Cause
この問題は、GNU C++ ランタイムライブラリによる、 STL コンテナクラスのインプリメント方法のために発生しています。
STL のテンプレートでは、デフォルト値 "_default_alloc_template" を第 2 クラスとして持っています。このクラスは、テンプレートクラスと共に、メモリがどのように確保されたかをコントロールしており、デフォルトのテンプレートは、 malloc() および free() をコールする回数を減らすために、メモリキャッシュを使います。
下記の例では、テンプレートが変数 v のためのメモリを確保するために malloc() をコールし、変数がメモリをクリアするとき、メモリは再利用できるようにキャッシュに置かれます。つまり free() がコールされません。そのため、Test RealTime、PurifyPlus RealTime はこれをメモリーリークと判断します。
Resolving The Problem
以下はソースコード例です:
#include <list>
#include <vector>
#include <iostream>
using namespace std;
main()
{
vector<int> v(6); /* MLK: Memory leaked here */
for (int j=0; j<6; j++){
v[j] = j;
cout << j <<":" << v[j] << endl;
}
v.clear();
}
関数の最後にクリアが行われているにも関わらず、Test RealTime と PurifyPlus RealTime にて "v" の宣言箇所でメモリリークがレポートされます。
メモリリークが報告されないようにするには、テスト中にコードを以下のように変更します。STL テンプレートクラスに malloc() および free() を毎回コールするようにさせることは、ほかのメモリアロケーションテンプレートを第 2 テンプレートパラメータとして特定することで可能です。
例:
#include <list>
#include <vector>
#include <iostream>
using namespace std;
main()
{
vector<int, _malloc_alloc_template<0>> v(6);
for (int j=0; j<6; j++){
v[j] = j;
cout << j <<":" << v[j] << endl;
}
v.clear();
}
これで、変数 "v" がスコープ外に出た際に、テンプレートクラスは free() をコールするのでメモリリークはレポートされません。
Related Information
Document Information
Modified date:
16 June 2018
UID
swg21172896