gpt4 book ai didi

Vector 容器中的 C++ 智能指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:36 25 4
gpt4 key购买 nike

我写了经典的 Shape Polymorphism 代码,但有点不同,因为我使用了 Vector 容器和智能指针。

我不是C++专家,我想了解以下内容:

  1. 是否存在内存泄漏?
  2. 如果我不调用 shapes.clear(),是否会发生内存泄漏?
  3. 有没有更好的方法来使用智能指针和容器?

代码:

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

class Shape {
public:
virtual float getArea() = 0;
virtual ~Shape() {}
};

class Rectangle : public Shape {
public:
Rectangle(float w, float h) : width(w), height(h) {}

float getArea() {
return width * height;
}
private:
float width;
float height;
};

class Circle : public Shape {
public:
Circle(float r) : radius(r) {}

float getArea() {
return 3.141592653589793238462643383279502884 * radius * radius;
}
private:
float radius;
};

void printShapeAreas(vector<shared_ptr<Shape>> &shapes) {
for(int i = 0; i < shapes.size(); i++) {
cout << shapes[i]->getArea() << endl;
}
}

int main(int argc, char** argv) {
vector<shared_ptr<Shape>> shapes;
//this works, but you told me that is better to use make_shared
//=============================================================
//shapes.push_back(shared_ptr<Shape>(new Rectangle(10, 2)));
//shapes.push_back(shared_ptr<Shape>(new Rectangle(10, 3)));
//shapes.push_back(shared_ptr<Shape>(new Circle(2)));
//shapes.push_back(shared_ptr<Shape>(new Circle(3)));
//better
//======
shapes.push_back(std::make_shared<Rectangle>(10, 2));
shapes.push_back(std::make_shared<Rectangle>(10, 3));
shapes.push_back(std::make_shared<Circle>(2));
shapes.push_back(std::make_shared<Circle>(3));
printShapeAreas(shapes);
shapes.clear();//If I don't call shapes.clear(), is there going to be a memory leak?
return 0;
}

谢谢你:)

最佳答案

您的代码不包含内存泄漏。所以你的第一点很好。

不,如果你不调用shapes.clear() , 自 std::vector 以来不会有内存泄漏的析构函数清理容器。

我不知道关于在容器中使用共享指针的具体规则,所以我将跳过你的第三个问题。

但是,我可以改进创建 std::shared_ptr小号:

当您使用其构造函数创建共享指针时,即 shared_ptr<T>(new T());控制 block 或保存有关该资源的簿记信息的结构,是与其指向的对象分开创建的。这可能会导致很多缓存未命中。但是,如果您创建一个 shared_ptr通过使用 std::make_shared ,控制 block 分配有您想要的对象,因此,通过将它们放在一起,您至少可以减轻缓存未命中的成本:std::make_shared<T>(); .例如:std::make_shared<Circle>(3)相当于写std::shared_ptr<Shape>(new Circle(3)) , 但通常更好。

关于Vector 容器中的 C++ 智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36321153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com