2017-10-24 6 views
-2

새 메모리를 만들고 생성자에서 사용하는 함수가 있습니다. 그러나 소멸자에서 그것을 삭제하는 방법에 액세스 할 수 있는지 모르겠습니다. 생성자에서C++의 함수로 인해 메모리 누수가 발생했습니다.

내가이 변경할 수 있어요 모든 통화 당 파일입니다

#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

복사 생성자 그렇지 않으면이 같은 장소에서 가리키는 것 ...

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

operator=이 작동하지 않는이있다, 깊은 복사 할 필요 사본 ...

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

이미 소멸자에 delete []이 있습니다.

3 (또는 0) 규칙은 리소스를 관리하는 방법에 대한 규칙입니다. 소멸자, 복사 생성자 또는 연산자 =를 구현하는 경우 세 가지를 모두 구현해야합니다.

그렇지 않으면 아무 것도 선택하지 않아도됩니다 (0 규칙). 생각하면 복사, 구성 또는 소멸시 리소스에주의가 필요한 경우 세 가지 동작 모두에 대해 잘 고려되는 개별 클래스로 만드는 것입니다.

기본 클래스 (예 : "string"클래스 - Player)를 만들면 Player가 포함 된 항목이 사본의 의미를 모르고 살아갈 수 있으며 리소스가 관리된다는 지식이 안전합니다.

+0

http://en.cppreference.com/w/cpp/language/rule_of_three에 대한 언급을 고려하십시오. –

관련 문제