我有一个类。让我们称之为House。各种财产的房屋都登记在册。让我们打电话给房屋登记处。在这个类中,我想添加一个向量,其中包含指向以不同方式排序的不同房屋的指针(可能是按名称和数字(。在这个类中,我有一个函数,它创建新的House对象并按相应的顺序插入它们。在这样做的过程中,我留下了内存泄漏,因为程序可能会以多种方式终止,但不会释放存储在向量中的内存。我知道我可以使用智能指针。但是我该如何以正确的方式实施它们呢?我有意省略析构函数,因为它的实现非常明显。但这个问题是专门针对智能指针的。一个好的答案最好包括用比较器实现它们。
class HouseRegistry{
struct House{
....
}
private:
vector<House*>HousesbyName;
vector<House*>HousesbyNumber
bool newHouse(...){
House *somehouse = new House;
....
HousesbyName.insert(inserter,somehouse);
HousesbyNumber.insert(inserter2,somehouse);
return true;
}
}
我知道一个解决方案可能看起来像
class HouseRegistry{
struct House{
....
}
private:
vector<shared_ptr<House>>HousesbyName;
vector<shared_ptr<House>>HousesbyNumber
bool newHouse(...){
auto somehouse = make_shared<House>();
....
HousesbyName.insert(inserter,somehouse);
HousesbyNumber.insert(inserter2,somehouse);
return true;
}
}
但是,当comparator函数使用两个House指针作为参数时,它会破坏像Binary Search这样的函数。如果寻找房屋的任何预先存在的情况,那么在这种情况下,后续的比较函数会是什么样子?
#include <vector>
#include <memory>
std::vector<std::shared_ptr<House>> HousesbyName;
std::vector<std::shared_ptr<House>> HousesbyNumber
auto somehouse = std::make_shared<House>();
...
HousesbyName.insert(inserter, somehouse);
HousesbyNumber.insert(inserter2, somehouse);
...
如何确保释放所有指针?
一般情况下:在您不再需要每个动态分配后,始终释放它们。
一般的答案很简单,遵循它并不容易。在不同的情况下,有一些方法可以让它变得更容易。最简单的方法是一开始就不要手动使用动态分配。您的示例并不一定表明需要它。您可以使用std::vector<House>
来存储对象。或者,您的用例似乎适合多索引容器。该标准没有提供多索引容器模板,但Boost提供了。
但是,如果您确实需要动态分配,避免泄漏的一个简单方法是永远不要使用new
、std::malloc
等,而是使用容器或std::make_unique
或std::make_shared
,并且永远不要调用std::unique_ptr::release
。