C 删除指向动态分配对象的指针

C++ delete pointer to dynamic allocated object

本文关键字:对象 指针 动态分配 删除      更新时间:2023-10-16

i加载文本文件,然后从其数据中我创建动态分配的对象,然后将其指针存储在向量中,并根据每个对象类型将其存储在两个容器中的一个中,我有两个问题:首先:如果我在读取文件函数中声明并初始化对象,然后将指针添加到向量,此对象是否在函数之外可用,直到我删除它或不删除它?如果没有解决方案?第二:我使用以下功能释放内存:

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

因此,我从包含所有对象的主容器中删除对象,我必须为具有相同指针的其他容器做到这一点吗?

注意:我在这一点上并不是很强大,因此,如果有误解,请清除它,并希望降低投票。

编辑:

i使用以下方法加载文本文件,我迭代其行,然后每行应创建一个项目,该项目必须添加到向量以稍后使用:

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

如果我使用智能指针或原始指针,则指针在功能完成后将不在范围内,那么哪个是想法?

一个一个问题,但我会尝试解释。

如果我声明并初始化读取文件函数中的对象 然后将指针添加到向量,此对象是否可用 在删除或不删除它之前的功能外部?

是的,如果在堆上创建对象(使用新的),则可以从上述向量可用。

因此,我从包含所有对象的主容器中删除对象,我必须为具有相同指针的其他容器做到这一点吗?

删除或删除(使用)已经删除指针是一个错误,您只能从向量中删除指针,以防止其进一步使用。

如果我使用智能指针或原始指针,则指针将退出 功能完成后的范围,那么哪个想法?

如果您使用智能指针,则取决于。在向量中存储非智能指针是毫无用处的,因为当您指出的那样将删除对象。因此,您应该将共享指针放入向量,在这种情况下,不会删除任何共享指针。

总结我敢打赌,使用共享指针是最好的解决方案。板条箱共享指针,将其放在您需要的任何向量中。当您想删除对象时,只需从任何向量中删除共享,并且对象将自动删除。