2010-04-17 5 views
0

포인터, 객체, 등,하지만 ...C++ 그것은 조금 혼동 될 수 있습니다

의 내가, vector<Operator*> 같은 것을 클래스에 벡터 형식 멤버 있다고 가정 해 봅시다 (전에서 운영자를 반환하는 내 클래스에 메소드가 이 컨테이너). 이제 Operator 객체 op을 수신하고 벡터에 삽입하는 메소드가 클래스에 있다고 가정 해 보겠습니다. 내가 알고 싶은 것은 : 벡터에 직접 삽입하여 문제가 있습니까? (push_back(&op))? 또는 복사 생성자를 사용하여 새 연산자를 만든 다음이 새 벡터를 push_back (new 연산자 (op))와 함께 벡터에 넣어야합니까?

는 당신에게 (스택에 여전히) 객체에 대한 포인터가 아닌 사본을 제공 & 연산을 사용하여

+1

무슨 사업자에 대해 이야기하고 있습니까? 당신은 명확하게 할 수 있습니다 –

+6

조금 혼란 스럽습니까? 적어도 혼동하는 바이트입니다. –

+1

귀하의 질문에 약간의 의미가 있습니다. 코드 예제를 추가하십시오. – Timmmm

답변

1

좋아, 내가하고있는 일을 수행하는지 확인해보기 바란다. 연산자이라는 클래스를 만들었습니다. vector <Operator *>이 있는데 문제가 있는지 궁금 할 것입니다.

짧은 대답은 예일 수 있습니다. 범위를 벗어나면 벡터에 포인터가있는 모든 Operator 객체에 대해 힙에 할당 된 메모리가 벡터에 의해 정리되지 않기 때문에 벡터 범위에 관한 것입니다. C++과 같은 관리되지 않는 언어에서, 당신을 위해 특별한 일을 처리하는 특수 클래스를 사용하지 않는다면, 범위 지정과 잠재적 인 메모리 누수에 대해 잘 알고 있어야합니다.

"스스로 누가 운영자 객체를 소유합니까?" 및 "누구가 운영자 힙에 할당되었거나 벡터의 포인터가 가리키는 개체를 정리할 책임이 있습니까?"

벡터를 소유 한 개체에 대해 소멸자가 호출 될 때 메모리를 정리할 수 있습니다.

나는 비슷한 당신이 this SO question보고 싶어 할 것 같아요. 다른 해결책이 있습니다. 예를 들어 boost 클래스를 사용하는 것이 더 좋을 수도 있습니다.

2

(운영자 내가 만든 클래스입니다). 따라서 객체가 범위를 벗어나고 정리되면 벡터의 포인터가 유효하지 않게되고 문제가 발생합니다.

가장 좋은 방법은 위에서 제안한 복사 생성자를 사용하는 것입니다.

+0

로들 (Lodle)이 말한 내용 : 주소를 누르기 만하면 나중에 참조 할 때 그곳에있을 것이라는 보장이 없습니다. 'new'를 사용하여 객체를 만든 경우 '삭제'할 때까지 계속 유지됩니다. 자동으로 (즉, 자동 선언을 사용하여) 생성 한 경우 계속 유지되지 않을 수 있습니다. 전역 적으로 정의 된 경우 아마 괜찮습니다 (예 : 복사하지 않아도 됨). – Rooke

관련 문제