2017-10-08 8 views
-2

以下のコードからメモリリークを取り除きたいと思います。私はそれをきれいにして、それを最も単純な形にしました。私はvalgrindからメモリリークを取得し続けます。私はオブジェクトの配列を使用して名前のリストをコンパイルし、最後にリークがないようにメモリをクリーンアップしたい。可能であれば、mainの配列を宣言したいと思います。削除[/]を使用していますが、まだメモリリークがあります

//in Player.h 

#include <iostream> 
#include <string> 
#include <string> 
#include <cstring> 

class Player 
{ 
    private: 
     std::string first, last; 

    public: 

     Player(); 

     ~Player(); //I tried my code with and without this destructor 

     Player(std::string first_name, std::string last_name); 
    }; 

//in player.cpp 

#include "Player.h" 
#include <iostream> 
#include <string> 
#include <cstring> 

Player::Player(std::string first_name, std::string last_name) 
{ 
    this->first=first_name; 
    this->last=last_name; 
} 

Player::~Player() 

{ //I tried both commands below separately and I still have memory leaks 

    //delete [] Player; 
    //delete [] myPlayer; 
} 

// in Driver.cpp 


#include "Player.h" 
#include <iostream> 
#include <string> 
#include <cstring> 
#include <cstdlib> 

int main() 
{ 
    std::string temp_First, temp_Last; 
    Player *myPlayer[2]; 

    temp_First="John"; 
    temp_Last="Smith"; 

    myPlayer[0] = new Player(temp_First, temp_Last); 

    temp_First="Poca"; 
    temp_Last="Hontas"; 

    myPlayer[1] = new Player(temp_First, temp_Last); 

    delete [] myPlayer; 

    return 0; 
} 
+6

はあなたがそもそもマニュアル 'DELETE'を使用する必要があり、コードを書くべきではありません。 –

+1

Std :: vectorは、新しい/削除の手間をかけずに必要なものを与えるので、メモリリークはありません。 – stefaanv

+0

これは、整数、倍精度の配列で完全に正常に動作します。しかし、オブジェクト配列の場合、一部のコンパイラはdelete []を使用している間は配列内のオブジェクトの各消滅者を呼び出すことをサポートしていません。したがって、残念ながらメモリを解放するためには、それぞれのデストラクタを呼び出さなければなりません。 –

答えて

4

あなたは別途myPlayerの各要素を解放する必要があります。

delete myPlayer[0]; 
delete myPlayer[1]; 

あなたはnewを2回呼び出しを持っているので、次の2回の対応delete/delete[]の呼び出しを必要とします。

4

あなたのコードにnew/deleteを使用する理由は何ですか?

シンプル

std::vector<Player> myPlayer; 

は十分であろう。

動的メモリ管理を避ける手がに巻き込まれていると、エラーが発生しやすく、悲しみやトラブルの原因が一貫しています。


可能であれば、私がメインで配列を宣言したいと思います。

ここ改訂コードです:

int main() 
{ 
    std::vector<Player> myPlayer { 
     { "John", "Smith" } , 
     { "Poca", "Hontas"} 
    }; 
    return 0; 
} 
関連する問題