2017-11-27 15 views
1

데이터 파일에서 텍스트 파일을로드 한 다음 동적으로 할당 된 객체를 만든 다음 포인터를 벡터에 저장하고 각 객체 유형에 따라 다른 두 컨테이너 중 하나에 저장합니다. 두 가지 질문이 있습니다. : 첫 번째 : 만약 내가 선언하고 파일을 읽은 함수 안에 개체를 초기화하고 벡터에 포인터를 추가하면, 내가 삭제할 때까지이 객체를 함수 밖에서 사용할 수있을 것인가? 해결책이 없다면? I 메모리 무료로 THIE 다음 함수를 사용합니다 : 두 번째 동적 할당 객체에 대한 포인터를 C++에서 삭제

for (int it = 0; it < phongItems.size(); it++) { 
    delete phongItems[it]; 
    phongItems[it] = nullptr; 
} 

그래서 난 모든 객체를 포함하는 주요 컨테이너에서 개체를 삭제를, 내가해야 할 그 같은 포인터 여부를 다른 용기에 대한?

참고 : 나는 그 시점에서 매우 강하지 못하다. 그래서 오해가 있다면 그것을 깨끗이하고 덜 투표하기를 바란다.

편집 :

void Game::loadLevel(std::string file) { 
    initAssets(mgr, dataPath, file); 
    std::string line; 
    ifstream f(dataPath + file); 
    if (!f.is_open()) 
     LOGE("game error while opening file %s", file.c_str()); 
    while (getline(f, line)) { 
     std::vector<std::string> tokens; 
     sSplit(line, ' ', tokens); 
     if (tokens[0] == "MESH") { 
      std::vector<std::string> typeToken; 
      sSplit(tokens[2], '=', typeToken); 
      std::vector<std::string> nameToken; 
      sSplit(tokens[1], '=', nameToken); 
      std::vector<std::string> countToken; 
      sSplit(tokens[3], '=', countToken); 
      std::vector<std::string> matrixToken; 
      sSplit(tokens[4], '=', matrixToken); 
      int count = atoi(countToken[1].c_str()); 
      //if I declare the pointer here and added it to the vector I can't use it later 
      StaticItem* item; 
      std::vector<GLfloat> mToken; 
      fSplit(matrixToken[1], ',', mToken); 
      item = new StaticItem(*engine, "/models/" + nameToken[1] + ".obj",nullptr,0); 
      item->narrow = true; 
      engine->addItem(item, true, true);    
     } 
    } 
    if (f.bad()) 
     LOGE("game error while reading file %s", file.c_str()); 
    f.close(); 
} 

void Engine::addItem(EngineItem* item, bool collision, bool loader) { 
    if (collision) 
     collisionItems.push_back(item); 
    if (loader) 
     loadItems.push_back(item); 
    phongItems.push_back(item); 
} 

:

나는 각 줄은 나중에 사용하기 위해 벡터에 추가 할 항목을 작성해야합니다, 나는 그것의 선을 반복 다음과 같은 방법을 사용하여 텍스트 파일을로드 스마트 포인터 또는 원시 포인터를 사용하면 함수가 완료된 후 포인터가 범위를 벗어나게됩니다. 그래서 어떤 생각입니까?

+2

'delete'는'new'로 한 번만 호출해야합니다. 스마트 포인터 나 적절한 컨테이너를 사용하면 자신이'new'를 사용하는 것을 피할 수 있습니다 (그래서'delete'도 없습니다). – Jarod42

+0

@ Jarod42 클래스 멤버로 선언 할 때'shared_ptr'을 사용하고있었습니다 만, 이제는 텍스트 파일에서 객체를 만들어야 만 읽을 때까지 무엇이 들어 있는지 알 수 없으므로'shared_ptr '로드 함수 내부에서 컨테이너에 추가하십시오. 함수 범위가 끝나고 사용할 수 없게되고 오류가 발생합니다. –

+1

로드 함수에서 소유권을 이전 할 수 있습니다. (코드가 없으면 오류를 정정하기가 어렵습니다.) – Jarod42

답변

2

하나의 질문에 많은 설명을 드리겠습니다. 내가 그것을 삭제 여부까지

내가 선언하고 다음 벡터에 포인터를 추가 한 파일 읽기 기능 내부의 객체를 초기화하는 경우,이 객체는 함수 외부 사용할 수 있습니다?

예, 개체가 힙에 작성된 경우 (새 항목 포함) 언급 한 벡터에서 사용할 수 있습니다.

그래서 모든 객체가 포함 된 기본 컨테이너에서 객체를 삭제합니다. 동일한 포인터가있는 다른 컨테이너에 대해 그렇게해야합니까?

이미 삭제 된 포인터를 삭제하거나 참조 해제하는 것은 오류이므로 더 이상 사용하지 않으려면 벡터에서 포인터 만 제거해야합니다.

스마트 포인터 또는 원시 포인터를 사용하면 포인터가 범위에서 벗어났습니다. 따라서 아이디어가 끝났습니까?

스마트 포인터를 사용하는 경우 해당 포인터가 사용됩니다. 비 스마트 포인터를 벡터에 저장하는 것은 가리키는대로 객체가 삭제되기 때문에 쓸모가 없습니다. 따라서 벡터에 공유 포인터를 두어야합니다.이 경우 객체는 공유 포인터가 존재할 때까지 삭제되지 않습니다.

요약하면 공유 포인터를 사용하는 것이 가장 좋은 방법 일 것입니다. 크레이트 공유 포인터, 필요한 벡터에 넣으십시오. 개체를 삭제하려면 벡터에서 공유를 제거하면 개체가 자동으로 삭제됩니다.

+0

고마워요,이 모든 대답과 내 비전은 분명합니다. –