データファイルからテキストファイルを読み込み、動的に割り当てられたオブジェクトを作成し、そのポインタをベクトルに格納します。 : 最初に:読み込みファイル関数内でオブジェクトを宣言して初期化し、ベクトルにポインタを追加した場合、削除するまでこのオブジェクトを関数の外で使用できるようになりますか?解決策は何ですか?私は、メモリ解放するために、チエニル、次の機能を使用します:第二 動的割り当てオブジェクトへのポインタの削除
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は、各ラインは、後で使用するためにベクターに追加しなければならない項目を作成する必要があり、私は、その行を繰り返し、以下の方法を使用してテキストファイルをロードしますスマートポインタや生ポインタを使用すると、関数が終了した後にポインタが範囲外になるので、どのアイデアですか?
'delete'は' new'で一度だけ呼び出すべきです。また、スマートポインタや適切なコンテナを使用することで、自分自身で 'new'を使用することを避けることができます(' delete'はありません)。 – Jarod42
@ Jarod42クラスメンバーとして宣言していたときに私は 'shared_ptr'を使用していましたが、テキストファイルからオブジェクトを作成する必要がありましたので、読んでから' shared_ptr '内部のロード関数内に追加してコンテナに追加すると、関数が終了してスコープ外になり、使用できなくなってエラーが発生すると思います。 –
ロード関数から所有権を譲渡することができます。 (コードなしでは、あなたのエラーを訂正するのは難しい)。 – Jarod42