2013-10-15 4 views
0

생성자의 힙에 선언 된 private 멤버가있는 클래스가 있습니다. 그런 다음 소멸자에서는 delete이됩니다. 이제 변수를 수정하는 메소드를 추가하고 싶습니다. 참조를 사용할 수 있기를 원하지만 관련 메모리의 특성에 대해 잘 모르겠습니다. 올바르게 수행하고 있음을 알고 싶습니다 (프로젝트가 메모리 부서에서 상당히 클 수 있음).).매개 변수 : 선언 된 위치는 어디입니까?

class A 
{ 
private: std::string str; 
/* ... */ 
public: 
A() 
{ 
str = new std::string(""); 
} 
~A(){delete str;} 

// method to modify str. 
}; 

참조로 전달한 경우 메모리 누수를 제거하고 메모리 사용을 최소화하기 위해 어떤 단계를 밟아야합니까? 즉, 나는 아직 최적화로 인해 그 모든 사람이되고 싶지는 않습니다.

힙에있는 멤버에 대한 getter 및 setter는 어떻게 작성해야합니까? 생성자 복사, 다른 건가요? 첫째

+1

std :: string 클래스는 이미 복사 생성자, 이동 생성자 및 할당 연산자를 캡슐화하는 자체 메모리 관리를 수행합니다. 이미이 클래스를 집계 할 때 다시 할 필요는 없습니다. –

+1

그러므로 집계 된 클래스 (private 멤버)가 자체 메모리 관리 (std :: string처럼)를 가지면 힙에 할당하지 마십시오.힙을 사용하는 이유가 될 수있는 헤더 파일에 많은 의존성이 있다고 염려한다면 pimpl_ idiom을 사용하십시오. –

+0

절대적으로 필요할 때까지 포인터와 힙 할당을 사용하지 마십시오. – Raja

답변

2

, private: std::string str;private: std::string* str;

현재 메모리 관리 모델은 classic RIIA model.입니다해야합니다. 첫째, 정리해야 할 몇 가지 질문이 있습니다.

  • A이 소유 한 객체는 str일까요?
  • A의 유효 기간 중 str을 사용 하시겠습니까?

위의 사항에 no로 대답하면이 모델이 사용자의 필요를 잘 충족하지 못합니다.

그렇지 않으면 계속 회원 기능을 구현할 수 있습니다. 여기에 몇 가지 실마리를 제공합니다.

std::string const& getStr() { 
    return *str; 
} 

세터 그냥 값을 변경할 수 게터 다시 참조를 반환 할 수 있습니다

, 복사 생성자를 들어

void setStr(std::string const& s){ 
    *str = s; 
} 

, 당신은 단지 std::string에서 복사 생성자를 호출하고 깊은 복사본을 만들 수 있습니다 ,

A(A const& obj){ 
    str = new std::string(*obj.str); 
} 
+0

RAII의 위키 페이지가 끔찍하다고 생각합니다. 훨씬 더 좋은 링크는 http://www.informit.com/articles/article.aspx?p=30642&seqNum=8 – Raja

+0

좋은 링크가 될 것입니다. –

+0

'str'을 포인터로 선언하는 것보다는'new'와'delete'를 사용하지 않는 것이 좋습니다. –

4

당신의 probl을 복잡하게 만듭니다. 여자 이름. 코드는 다음과 같아야합니다.

class A 
{ 
    private: std::string str; 

    public: 
     A() { str = ""; } 
     std::string GetStr() { return str; } 
     void SetStr(std::string value) { str = value; } 
}; 

생성자가 빈 문자열로 데이터 멤버를 초기화하고 있습니다. 소멸자가 필요하지 않습니다. 문자열 클래스는 모든 정리 작업을 수행합니다. 그리고 위의 샘플 메소드와 같이 데이터 필드를 사용할 수 있습니다.

특수한 복사/이동 방법을 추가하지 마십시오. 문자열 클래스를 사용하는 방법에 대한 설명서를주의 깊게 읽으십시오.

+1

'std :: string'의 기본 생성자는 이미 그것을 빈 문자열로 초기화합니다. –

+0

사실입니다. 원본 코드에 더 가까워 지려고 노력했습니다. –

+1

Getter 및 Setter는 각각 return 및 매개 변수에 const &를 사용해야합니다. :-) –

관련 문제