質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

c++ 待ち行列シミュレーションにおけるメモリリークの発見

mikocchan
mikocchan

総合スコア3

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0リアクション

0クリップ

217閲覧

投稿2022/08/17 06:54

前提

待ち行列シミュレーションをc++を用いて作成しています。
シミュレーションを実行した際に、メモリリークが発生しているであろうことが分かりましたが、発生箇所がわかりません。valgrindなどのメモリリーク検出ツールを使おうと考えましたが、使い方がよくわからなかったです。

実現したいこと

メモリリークの検出

発生している問題・エラーメッセージ

valgrindが導入できない、メモリリーク箇所が見つけられない。
main関数やクラスのソースコードを添付いたします。待ち行列のリストを管理するクラスcustomerCollectionのソースファイルの方(customerCollection.cpp)にメモリリークの原因があるのではと考えているのですが、詳しい場所はわかりませんでした。

該当のソースコード

customerRecord.h

#ifndef customerRecord_h #define customerRecord_h #include <iostream> #include <math.h> #include <stdio.h>//NULLの定義 #include <stdlib.h>//exit()の定義 //----------------------------------------------ヘッダファイル クラス型をかく class customerRecord { private://class外からのアクセス不可 ここにはメンバ変数を書く メンバ変数は変数名の頭に_もしくはmをつける(ルールは会社により異なる) int _id; // カスタマー番号 int _check; // q1到着(0)、q2到着(1)、q2退去()2チェック double _q1arrivalTime; // q1到着時刻 double _arrivalTime; // q2到着時刻 double _departureTime; // q2退去時刻 double _startTime; // q2サービス開始時間 public://class外からのアクセス可 ここにはメンバ関数を書く。中身はソースファイル(.cpp)に書く。 int customerID(); // これを描くことでID(_idのこと)を取得できる。 void setcustomerID(int id); // ここでcustomerRecordのidをセット(設定)する。 int check(); //到着、退去の取得 void setCheck(int check); double q1ArrivalTime(); void setq1ArrivalTime(double q1arrivalTime); double ArrivalTime(); void setArrivalTime(double arrivalTime); double DepartureTime(); void setDepartureTime(double departureTime); double StartTime(); void setStartTime(double startTime); double getTime();//これを描くことで時間を取得できる。 customerRecord(); //デフォルトコンストラクタ:引数のないコンストラクタ customerRecord(int customerID,int check,double q1ArrivalTime,double ArrivalTime,double DepartureTime,double StartTime); // 引数を持つコンストラクタ ~customerRecord();//デストラクタ }; //---------------------------------------------- #endif

customerRecord.cpp

//ソースファイル:クラスcustomerRecordのメンバ関数の中身を記述 #include <iostream> #include <math.h> #include <stdio.h>//NULLの定義 #include <stdlib.h>//exit()の定義 #include "customerRecord.h" using namespace std; //以下変数取得のためのメンバ関数 int customerRecord::customerID(){//カスタマー番号の取得 return _id; } void customerRecord::setcustomerID(int id){//カスタマー番号の設定 _id = id; } int customerRecord::check(){ return _check; } void customerRecord::setCheck(int check){ _check = check; } //追加 double customerRecord::q1ArrivalTime(){ return _q1arrivalTime; } void customerRecord::setq1ArrivalTime(double q1arrivalTime){ _q1arrivalTime = q1arrivalTime; } // double customerRecord::ArrivalTime(){ return _arrivalTime; } void customerRecord::setArrivalTime(double arrivalTime){ _arrivalTime = arrivalTime; } double customerRecord::DepartureTime(){ return _departureTime; } void customerRecord::setDepartureTime(double departureTime){ _departureTime = departureTime; } double customerRecord::StartTime(){ return _startTime; } void customerRecord::setStartTime(double startTime){ _startTime = startTime; } //変更 double customerRecord::getTime(){ if(check() == 0){//q1到着 return q1ArrivalTime(); } else if(check() == 1){//q2到着 return ArrivalTime(); } else if(check() == 2){//q2退去 return DepartureTime(); } else{ cout << "ERROR_getTime"<<endl; exit(1); } } //以下コンストラクタ等 追加 customerRecord::customerRecord(){//デフォルトコンストラクタ:引数のないコンストラクタ setcustomerID(-1);//全部に-1を設定ー>初期化 setCheck(-1); setq1ArrivalTime(-1); setArrivalTime(-1); setDepartureTime(-1); setStartTime(-1); } customerRecord::customerRecord(int customerID,int check,double q1ArrivalTime,double ArrivalTime,double DepartureTime,double StartTime){//引数を持つコンストラクタ setcustomerID(customerID); setCheck(check); setq1ArrivalTime(q1ArrivalTime); setArrivalTime(ArrivalTime); setDepartureTime(DepartureTime); setStartTime(StartTime); } customerRecord::~customerRecord(){ //特に処理なし }

customerCollection.h

#ifndef customerCollection_h #define customerCollection_h #include <iostream> #include <math.h> #include <stdio.h>//NULLの定義 #include <stdlib.h>//exit()の定義 #include "customerRecord.h" //----------------------------------------------ヘッダファイル クラス型をかく class customerCollection { private: struct customerNode { customerRecord customerData; // カスタマーレコード customerNode *next = NULL; };//構造体の中にクラスと次のクラスに向けたポインタを格納している typedef customerNode *customerList;//構造体customerNodeの名前をcustomerListに変更 そのつながりのことをリストと表現! customerList _listHead; // 連結リストの先頭を示すメンバ変数 void deleteList(customerList &listPtr); customerList copiedList(const customerList original);//構造体を複製してるので、コピーコンストラクタとは違う public: customerCollection(); // デフォルトコンストラクタ customerCollection(const customerCollection &original){_listHead = copiedList(original._listHead);}//コピーコンストラクタ ~customerCollection();// デストラクタ customerCollection& operator = (const customerCollection &cc); //代入 =という演算子をオーバーロードしている void addRecord(customerRecord newcustomer); void deletecustomer(); int top(); int getcustomerID(); int getcheck(); double getq1ArrivalTime();//追加 double getArrivalTime(); double getDepartureTime(); double getStartTime(); }; //---------------------------------------------- #endif

customerCollection.cpp

//ソースファイル:クラスcustomerRecordのメンバ関数の中身を記述 #include <iostream> #include <math.h> #include <stdio.h>//NULLの定義 #include <stdlib.h>//exit()の定義 #include "customerCollection.h" using namespace std; void customerCollection::deleteList(customerList&listPtr){//リスト内を全て完全に削除=デストラクタ while (listPtr != NULL){ customerNode *temp = listPtr; listPtr = listPtr -> next; delete temp; } } customerCollection::customerCollection(){//デフォルトコンストラクタ _listHead = NULL; } /*customerCollection::customerCollection(const customerCollection &original){//コピーコンストラクタ .hの方にもう書いてある _listHead = copiedList(original._listHead); }*/ customerCollection::~customerCollection(){//デストラクタ deleteList(_listHead); } void customerCollection::addRecord(customerRecord newcustomer){ customerList x = new customerNode; customerNode *newNode = new customerNode; x = _listHead; newNode -> customerData = newcustomer; if(_listHead == NULL){//何もない状態のとき _listHead = newNode; //delete x; //delete newNode; return; } else if(_listHead->customerData.getTime() > newcustomer.getTime()){//挿入 newNode -> next = _listHead; _listHead = newNode; //delete x; //delete newNode; return; } while(1){ if(x -> next == NULL){ x -> next = newNode; newNode -> next = NULL; //delete x; //delete newNode; break; } else if(x -> next -> customerData.getTime() > newcustomer.getTime()){ newNode -> next = x -> next; x -> next = newNode; //delete x; //delete newNode; break; } x = x -> next; } } void customerCollection::deletecustomer(){//先頭の客のデータを削除=後ろにずらすイメージ customerList x = new customerNode; x = _listHead; if(x == NULL){ exit(1); }//1:異常終了 0:正常終了 else if(x -> next == NULL){ _listHead = NULL; //delete x; } else{ _listHead = _listHead->next; //delete x; } delete x; } int customerCollection::top(){//客がいればtrue if(_listHead != NULL) return true; else return false; } int customerCollection::getcustomerID(){//先頭のcustomerIDを返す return _listHead->customerData.customerID(); } int customerCollection::getcheck(){ return _listHead->customerData.check(); } double customerCollection::getq1ArrivalTime(){ return _listHead->customerData.q1ArrivalTime(); } double customerCollection::getArrivalTime(){ return _listHead->customerData.ArrivalTime(); } double customerCollection::getDepartureTime(){ return _listHead->customerData.DepartureTime(); } double customerCollection::getStartTime(){ return _listHead->customerData.StartTime(); }

simulation4.h

#ifndef simulation4_h #define simulation4_h #include "customerRecord.h" #include "customerCollection.h" //mu1とmu2を入れると、その時の正規化した平均AoIを導出する。 //0805のミーティングでのミスを改善する #include <iostream> #include <math.h> #include <stdio.h>//NULLの定義 #include <stdlib.h>//exit()の定義 #include <random> using namespace std; //----------------------------------------------ヘッダファイル クラス型をかく class simulation{ private: double _mu1; double _mu2; double _L2_0_border; double _L2_1_border; double _L2_2_border; public: double MU1(); void setMU1(double mu1); double MU2(); void setMU2(double mu2); double L2_0_Border(); void setL2_0_Border(double L2_0_border); double L2_1_Border(); void setL2_1_Border(double L2_1_border); double L2_2_Border(); void setL2_2_Border(double L2_2_border); simulation(double MU1,double MU2,double L2_0_Border,double L2_1_Border,double L2_2_Border);//コンストラクタ double L2_border(int L2,double L2_0_border,double L2_1_border,double L2_2_border); pair<double,double> AoI_return(double mu1,double mu2,double L2_0_border,double L2_1_border,double L2_2_border);//AoIを返すメンバ関数 ~simulation();//デストラクタ }; //---------------------------------------------- #endif

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

MacOS Monterey ver12.5 を使用しています。
エディタはvscodeです。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。