문제

저는 C ++ 프로그래밍을 처음 사용하고 있으며 사전 지식이 많지 않은 답변에 크게 감사 할 것입니다.

여기에 제안 덕분에 반대되지 않은지도를 만들었습니다.

typedef std::tr1::unordered_map<std::string, Strain*> hmap;

이 맵의 데이터는 클래스 변형 인스턴스에 대한 포인터입니다. 이 인스턴스가 만들어 지 자마자 포인터를 만들고 해시 테이블 (HMAP TRAINTable)과 다른 벡터 (벡터 <변형 *> Livestrains) 에이 포인터를 추가합니다.

string MRCA;
for ( int b = 0; b < SEQ_LENGTH; b++ ) {
 int randBase = rgen.uniform(0,NUM_BASES); 
 MRCA.push_back( BASES[ randBase ] );
}
Strain * firstStrainPtr;
firstStrainPtr = new Strain( idCtr, MRCA, NUM_STEPS );
liveStrains.push_back( firstStrainPtr ); 
strainTable[ MRCA ]= firstStrainPtr;

클래스 변형 사례는 절대 삭제되지 않으며, 그것에 대한 포인터는 맹렬한 상태에서 제거되지 않습니다. 포인터는 때때로 벡터 <변형 *> 라이브 스트레인과 벡터 <변형 *> 데드 스트레인 사이를 이동하지만, 한 번은 맹렬한 상태를 유지하면 맹렬한 상태를 유지합니다.

이 코셔 야? 근본적인 인스턴스가 결코 파괴되지 않는 한, 그들에게 추가 된 포인터가 그대로 남아 있을까요?

또한 첫 번째 항목, 예를 들어, The Traintable의 포인터에서 멤버 속성을 항상 얻을 수 있어야하는 것도 맞습니까?

 hmap::const_iterator itr1 = strainTable.begin();
 int id = (itr1->second)->getStrainID();

나는 잠시 후, 쓰레기에 대한 나의 맹렬한 지점에있는 지점을 발견했다.

도움이 되었습니까?

해결책

할당 된 물체에 대한 포인터 new 전화 할 때까지 유효합니다 delete 대상에. 포인터를 원하는만큼 복사 할 수 있으며, 기본 객체가 삭제되지 않는 한 유효합니다.

둘째, 예, 컨테이너 반복기를 통해 저장된 포인터에서 객체 속성에 액세스 할 수있는 것이 맞습니다. 그러나 항상 hmap :: find ()의 반환 값이 hmap :: end ()와 같지 않은지 확인하십시오.

그래서 당신이 묘사하는 것은 괜찮습니다. 이제 당신의 맹렬한 포인터가 왜 쓰레기를 가리키고 있는지에 대해서는 더 자세한 내용 없이는 말할 수 없었습니다. 어디서나 객체를 삭제하지 않을 것이라고 확신하십니까? 한 벡터에서 다른 벡터로 포인터를 복사 할 때 올바르게하고 있다고 확신합니까?

다른 팁

당신이 결코 delete 그들, 그러면 포인터는 여전히 괜찮습니다. 반면에, 당신은 물건을 약간 더 깔끔하게 유지하고 전체 Shebang에 표준 용기를 사용하고 싶을 것입니다.

typedef std::tr1::unordered_map<std::string, Strain> hmap;
typedef std::tr1::unordered_map<std::string, hmap::iterator> weakhmap;

hmap strainTable;
weakhmap liveStrains;
Strain firstStrain( idCtr, MRCA, NUM_STEPS );
strainTable[MRCA] = firstStrain;
liveStrains[MRCA] = strainTable.find(MRCA);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top