2017-10-24 4 views
-2

新しいメモリを作成してコンストラクタで使用する関数があります。 しかし、私はそれを削除するためにデストラクタでそれにアクセスする方法を知らない。コンストラクタでC++の関数によるメモリリーク

は私が変更させていただくすべての.cppファイルである

#include <string.h> 

#include "Player.h" 

// TODO: Fix the bugs in this file 

Player::Player(const char* name) : name_(0) 
{ 
    copyString(&name_, name); 
} 

Player::Player(const Player& copy) : name_(0) 
{ 
    name_ = copy.name_; 
} 

Player::~Player() 
{ 
    delete [] name_; // Not sure if it works. errors promts- double free 
} 

Player& Player::operator=(const Player& copy) 
{ 
    return *this; 
} 

void Player::copyString(char** dest, const char* source) 
{ 
    unsigned int str_len = strlen(source); 
    char* str = new char[str_len+1]; //This line 
    strncpy(str, source, str_len); 
    str[str_len] = '\0'; 

    *dest = str; 
} 

std::ostream& operator<<(std::ostream& out, const Player& player) 
{ 
    out << player.name_ << std::endl; 
    return out; 
} 

(同じファイル)player.cppに使用されています。 削除行iデストラクタを追加しましたが、エラーが表示されます。

+1

'delete [] name_;'?より情報に基づいた答えを得るために、クラス定義を含め、より多くのコードを投稿する必要があります。 –

+3

'name_'がそのメモリを指している場合、' [[name_;]を削除できませんか?実際のプロジェクトでは 'std :: string'を、ポインタを持たないポインタではなくスマートポインタを使うことを検討してください。 –

+1

カスタムデストラクタを持っている(または必要としている)ようです。いくつかは、次のカップルのバグとは何かを試してみるために読んでいます:[3のルールとは何ですか?](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – user4581301

答えて

1

コピーコンストラクタがoperator=は動作しません

...そうでない場合は、同じ場所を指して2つのことがあり、深いコピーを行うには

Player::Player(const Player& copy) : name_(0) 
{ 
    copyString(&name_, copy.name_); 
} 
を必要とする - ちょうど古い値を無視し、そうも行う必要がありますコピー...

Player& Player::operator=(const Player& copy) 
{ 
    if(this != & copy){ 
     delete [] name_; 
     copyString(&name_, copy.name_); 
    } 
    return *this; 
} 

すでにデストラクタにdelete []があります。

3(または0)のルールは、リソースの管理方法に関するルールです。デストラクタ、コピーコンストラクタ、または演算子=を実装する場合は、おそらく3つすべてを実装する必要があります。

そうでなければ、どれも(0のルール)でOKになります。考えてみると、コピー、構築、破壊の際にリソースに注意が必要な場合は、それを3つのすべての動作についてよく考慮された個々のクラスにすることです。

基本クラス(この "string"クラス - Playerなど)を作成した場合、Playerを含むものはコピーのセマンティクスを知らなくても、リソースがそれらのために管理されるという知識で安全です。

+0

http://en.cppreference.com/w/cpp/language/rule_of_threeに言及することを検討してください –

関連する問題