2016-12-10 6 views
-1

포인터와 클래스 객체를 반환 호출 함수내가 동적으로 할당 된 포인터가 <code>delete</code> '에드와의 허상 포인터를 생성로</p> <pre><code>class Foo { public: char* ptr; Foo() { ptr=new char [10]; } ~Foo() { delete [] ptr; } }; </code></pre> <p>나는이 클래스의 객체를 반환하는 것은 불가능하다는 것을 배웠다 클래스를 가지고

그래서 어떻게이 클래스의 객체를 반환 할 수 있습니까 ?? 이 내가 원하는되지 않고 실제 클래스의 단지 표현입니다

Foo Bar() 
{ 
    Foo obj; 
    return Foo(obj);  //invokes copy constructor 
} 

Foo Bar() 
{ 
    Foo obj; 
    return obj; 
} 

은이 복사 생성자

Foo::Foo(const Foo& obj) 
{ 
    ptr = new char [10]; 
    for(int i = 0 ; i < 10 ;++i) 
     ptr [i] = obj.ptr[i]; 
} 

그리고 기능을 추가하여 해결 될 수있다 권장 표준에 따라 생성되었습니다 (즉, std::string 또는 std::vector을 사용하지 마십시오).

+0

@PaulMcKenzie 문제를 극복하기 위해해야 ​​할 일을 설명하지 않습니다. – WARhead

+1

이 링크는 복사 생성자, 할당 연산자 및 소멸자가 필요함을 보여줍니다. – PaulMcKenzie

+1

@WARhead, 첫 번째 대답에서 ** 리소스 관리 ** 섹션을 보았습니까? –

답변

0

어떻게이 클래스의 객체를 반환 할 수 있습니까 ??

메모리를 올바르게 관리하는 복사 생성자와 복사 할당 연산자를 구현해야합니다. ptr 항상 10 개 char의 배열 될 것입니다 경우

// Copy constructor 
Foo(Foo const& copy) : ptr(new char[strlen(copy.ptr)+1]) 
{ 
    strcpy(ptr, copy.ptr); 
} 

// Copy assignment operator 
Foo& operator=(Foo const& rhs) 
{ 
    // Don't do anything for self assignment 
    if (this != &rhs) 
    { 
     delete [] ptr; 
     ptr = new char[strlen(rhs.ptr)+1]); 
     strcpy(ptr, rhs.ptr); 
    } 
    return *this; 
} 

, 당신은 복사 생성자를 재고하고 할당을 복사해야합니다.

// Copy constructor 
Foo(Foo const& copy) : ptr(new char[10]) 
{ 
    memcpy(ptr, copy.ptr, 10); 
} 

// Copy assignment operator 
Foo& operator=(Foo const& rhs) 
{ 
    // Don't do anything for self assignment 
    if (this != &rhs) 
    { 
     memcpy(ptr, rhs.ptr, 10); 
    } 
    return *this; 
} 
+0

int 할당 연산자가'Foo const &'또는'const Foo &'입니까? 그렇지 않으면 차이가 있습니까? – WARhead

+0

@WARhead, 차이가 없습니다. 'Foo const &'코딩 스타일을 선호합니다. –