保存指向在本地创建的堆的指针

Saving a pointer to heap created in the local area

我制作了一个“Planet”class,并试图在我的项目的客户端文件中基于此 class 初始化一个向量数组。

bool addPlanet(std::vector<Planet>& planets, std::string filePath)
{
    std::ifstream infile(filePath, std::ios_base::in);
 
    if (infile.fail()) {
        // File could not be opened
        return false;
    }
 
    std::string planetName, imagePath;
    float posX, posY, rotationZ, scaleX, scaleY;
    unsigned long long int planetMass;
 
    while (infile >> planetName >> posX >> posY >> rotationZ >> scaleX >> scaleY >> planetMass >> imagePath)
    {
        Planet* newPlanet = new Planet(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);
        
        planets.push_back(*newPlanet);
    }
 
    infile.close();
 
    return true;
}

但我无法确定是否是以下代码导致了内存泄漏:

while (infile >> planetName >> posX >> posY >> rotationZ >> scaleX >> scaleY >> planetMass >> imagePath)
{
    Planet* newPlanet = new Planet(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);
        
    planets.push_back(*newPlanet);
}

我是这样想的:

我为“星球”的新实例分配动态内存class。使用 push_back 方法 — vector 的内部迭代器成为指向新实例的第二个指针。而当我们退出循环的时候,vector中还有一个指向新分配的堆的指针。

我是否理解正确,还是我只是不善于阅读文档?

您的代码创建了一个 Planet 对象:

Planet* newPlanet = new Planet(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);

然后,它复制这个对象到向量中:

planets.push_back(*newPlanet);

但是并没有释放原来对象对应的内存。向量仅拥有副本,不拥有原始 Planet 对象。


你可以简单地解决这个问题,但根本不使用 new:

Planet newPlanet(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);
planets.push_back(std::move(newPlanet));

在这里,它是拥有 newPlanet 对象的代码块。

但是,您可能想直接使用 std::vector::emplace_back() 而不是 newpush_back():

planets.emplace_back(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);

这样,向量就获得了创建的单个 Planet 对象的所有权。