IBM Support

GNU C++ ライブラリの STL コンテナクラスからレポートされるメモリリークについて

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() をコールするのでメモリリークはレポートされません。

[{"Product":{"code":"SSSHUF","label":"Rational Test RealTime"},"Business Unit":{"code":"BU053","label":"Cloud & Data Platform"},"Component":"Not Applicable","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"}],"Version":"2003.06.00;2003.06.12;2003.06.13;2003.06.14;2003.06.15;7.0;7.0.0.1;7.0.5;7.0.5.1","Edition":"","Line of Business":{"code":"LOB15","label":"Integration"}},{"Product":{"code":"SSSHAD","label":"Rational PurifyPlus RealTime"},"Business Unit":{"code":"BU053","label":"Cloud & Data Platform"},"Component":" ","Platform":[{"code":"","label":"RedHat Linux"},{"code":"PF027","label":"Solaris"},{"code":"","label":"SuSe"}],"Version":"2003","Edition":"All Editions","Line of Business":{"code":"","label":""}}]

Document Information

Modified date:
16 June 2018

UID

swg21172896