保存指向在本地创建的堆的指针
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()
而不是 new
和 push_back()
:
planets.emplace_back(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);
这样,向量就获得了创建的单个 Planet
对象的所有权。
我制作了一个“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()
而不是 new
和 push_back()
:
planets.emplace_back(sf::Vector2f(posX, posY), rotationZ, sf::Vector2f(scaleX, scaleY), planetMass, imagePath);
这样,向量就获得了创建的单个 Planet
对象的所有权。