2012-02-15 3 views
7

를 인스턴스화 ++ 나는 보통이 방법C 나 C에서 클래스를 인스턴스화 할 때

Book bk = new Book(); 

교수님이

Book &bk = *new Book(); 

그는 단지 저에게 최근 한 그는 화살표 (예 : bk-> getTitle();) 대신 도트 (예 : bk.getTitle();) 연산자를 사용할 수 있도록 참조를 사용합니다. 코드의이 부분을 이해하지만 새로운 연산자와 함께 * 연산자를 사용하면 어떻게됩니까? 전체 예제 코드는 주요 기능

+7

그래서 교수님은 메모리 누수 방법을 보여 주셨습니다. – ildjarn

+2

교수님이 정말로 그렇게해서는 안되는 것의 예가 아닌 다른 코드를 사용한다면 교수님을 찾아야합니다. –

+0

아마 교수님이 'const Book & bk = Book();'이라고 말씀 하셨을 것입니다. 그것이 사실이 아니라면, 나는 당신의 교수가 의미하는 것을 솔직히 이해하지 못합니다. – Mahesh

답변

15

에서 인 ArrayStack입니다 here 찾을 수 있습니다

사전에

감사이 :

Book &bk = *new Book(); 

이에 거의 동일합니다 :

Book *p = new Book(); // Pointer to new book 
Book &bk = *p; // Reference to that book 

하지만 한 가지 중요한 차이점이 있습니다. 원래 코드에서는 포인터를 사용하지 않아도 동적으로 할당 된 객체를 완료 할 때 delete에 사용할 수 있으므로 효과적으로 메모리 누수가 발생했습니다. 물론

,이 작업을 수행 할 수 있습니다 :

delete &bk; 

을하지만 그 의 매우 C++ 비 관용적, 나중에 문제를 일으킬 가능성이 높다.

요약하면 코드를 쓸 이유가 전혀 없으므로 이 아닙니다. 다음 중 하나라도 괜찮습니다.

Book bk; 
Book bk = Book(); 
+0

나는 그것을 사용하지 않을 것이라고 생각합니다. 클래스는 C++보다 디자인 패턴에 대한 것입니다. 그래서이 프로그래밍 스타일을 무시하고 내 방식대로 수행 할 것입니다. – tim

+1

당신은 분명히 메모리 누출을 만들지는 않았지만 나는 그것이 엄청난 과장이라고 생각한다. –

+0

@Seth : 원래의 코드는 실제로 누수가있다. 무엇을 의미 하는가? – ildjarn

0

나는 그 구문에 대해 생각해 볼 상황을 발견했습니다. Base 클래스에 대한 스마트 포인터를 생각해 보면 파생 클래스에 대한 포인터를 보유하고 있고 파생 클래스의 가상이 아닌 일부 객체에 액세스하려고합니다. 이 같은이 경우 뭔가 법적으로 그렇게 나쁘지 않을 수에서 :

Derived & d = * new Derived(); 

d.d_method(..whatever..); 
d.d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(&d); 

마지막으로 내가 여전히 이상한 앰퍼샌드에있는 작은 화살표를 선호 :

Derived d = new Derived(); 

d->d_method(..whatever..); 
d->d_member = ..whatever..; 
... 

std::unique_ptr<Base> p(d); 

하지만이있는 경우라고 생각합니다 취향의 문제, 특히 일관된 수의 방법에 액세스하는 경우.

누출되거나 delete &d;으로 이어지는 다른 것들이 나쁘거나 나쁘거나 나쁘다.

관련 문제