2017-11-27 15 views
1

データファイルからテキストファイルを読み込み、動的に割り当てられたオブジェクトを作成し、そのポインタをベクトルに格納します。 : 最初に:読み込みファイル関数内でオブジェクトを宣言して初期化し、ベクトルにポインタを追加した場合、削除するまでこのオブジェクトを関数の外で使用できるようになりますか?解決策は何ですか?私は、メモリ解放するために、チエニル、次の機能を使用します:第二 動的割り当てオブジェクトへのポインタの削除

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); 
} 

Iは、各ラインは、後で使用するためにベクターに追加しなければならない項目を作成する必要があり、私は、その行を繰り返し、以下の方法を使用してテキストファイルをロードしますスマートポインタや生ポインタを使用すると、関数が終了した後にポインタが範囲外になるので、どのアイデアですか?

+2

'delete'は' new'で一度だけ呼び出すべきです。また、スマートポインタや適切なコンテナを使用することで、自分自身で 'new'を使用することを避けることができます(' delete'はありません)。 – Jarod42

+0

@ Jarod42クラスメンバーとして宣言していたときに私は 'shared_ptr'を使用していましたが、テキストファイルからオブジェクトを作成する必要がありましたので、読んでから' shared_ptr '内部のロード関数内に追加してコンテナに追加すると、関数が終了してスコープ外になり、使用できなくなってエラーが発生すると思います。 –

+1

ロード関数から所有権を譲渡することができます。 (コードなしでは、あなたのエラーを訂正するのは難しい)。 – Jarod42

答えて

2

多くの質問に1つ、私は説明しようとします。私は宣言し、読み込みファイル機能 内のオブジェクトを初期化し、その後、ベクターへのポインタを追加した場合、私はそれを削除するかどうかまで

、このオブジェクトは、関数の外 利用できるようになりますか?

はい、ヒープ上にオブジェクトが作成されている場合は、上記のベクターから利用できます(新規)。

すべてのオブジェクトを含むメインコンテナからオブジェクトを削除するので、同じポインタを持つ他のコンテナに対して行う必要がありますか?

すでに削除されたポインタを削除(参照)するのはエラーです。それ以上の使用を避けるためには、ベクターからポインタを削除するだけです。

スマートポインタまたは生ポインタを使用すると、ポインタは機能終了後に スコープから外れてしまいますので、どのアイデアですか?

スマートポインタを使用する場合は、それが依存します。非スマートポインタをベクトルに格納することは、あなたが指摘したようにオブジェクトが削除されるので役に立たない。したがって、共有ポインタをベクトルに置く必要があります。この場合、共有ポインタが存在するまでオブジェクトは削除されません。

要約すると、私は共有ポインタを使用することが最良の解決策であると確信しています。あなたが必要とする任意のベクトルにそれを入れてください。オブジェクトを削除する場合は、ベクターから共有を削除すれば、オブジェクトは自動的に削除されます。

+0

ありがとう、この答えは私のすべての質問とビジョンは今明らかです。 –

関連する問題