如果我的班级正确地管理资源,那么拥有聪明的poointers有什么意义?

问题描述 投票:2回答:2

我是智能指针的新手,我喜欢将它们用于共享对象的安全性和力量...

我有一个问题:如果我的班级使用一些经验法则(例如Big 5和Big 3)在其构造函数和析构函数中管理资源,我是否仍应使用智能指针?否则我的课可以代替他们。因为正如我在C ++ Primer 5 Edition中所读的那样,智能指针解决了原始指针所面临的问题,例如内存泄漏,双删除指针和访问悬空指针……我的课程可以避免这些问题:

class BallGame {
    public:
        using Resource = int;

        BallGame(int);
        BallGame(const BallGame&);
        BallGame(BallGame&&);
        BallGame& operator=(const BallGame&);
        BallGame& operator=(BallGame&&);
        ~BallGame();
    private:
        Resource m_res;
};
  • 考虑到我的班级成员正在做正确的事情,所以我可以避免使用智能指针吗?

  • 我想知道某些情况下我应该使用智能指针而不是在班级中管理资源。

  • 它们真的适用于“哑类”(定义构造函数,但行为不佳的析构函数的类),就像C ++入门书中的一样。

c++ c++11 smart-pointers
2个回答
2
投票
您的问题可以理解为

如果我在使用的每个类中为智能指针的内存所有权实现正确的语义,可以避免使用智能指针吗?

是,但是为什么呢?当您需要动态数组时,是否需要在每次需要时手动重新实现基本的std::vector语义?我不这么认为。

这是库的目的,避免每次都重新发明轮子。

1
投票
正如您在书中所读的:他们解决了原始指针因此面临的问题:请考虑以下问题:

int* ptr = new int[1024]; // oh my God! forgot to free it then welcome to memory leak std::string* pStr = new std::string("Hello"); delete pStr; //... // and at some point in the program you think it is time to free pStr which has been already freed (among hundreds of code lines) then welcome to U.B. std::cout << *pStr << std::endl; // pStr is a dangling pointer. U.B

使用智能指针解决此问题:

std::unique_ptr<int> upi = std::make_unique(7); // use upi effectively and don't care about freeing it because it automatically will be freed for you.

  • 类无法支持的另一个原因是在许多对象之间有效地共享同一对象。实际上,您可以通过在类中应用浅表副本来实现这一点,但是问题是谁将释放该资源,然后您最终可能在小类中实现了shared_ptr的功能!
  • 每个新版本的C ++都具有新的功能和强大的功能,因此您应该坚持使用这些库,而不是重新发明它。如果仅出于某种教育原因,那么可以练习。
  • 如果您看,您会发现真正的程序包含智能指针作为成员,这些指针使您的类更健壮。

0
投票
尚未提到的智能指针的另一个好处是,它们使正在阅读代码的人对该对象的生存期有了体面的想法。带有原始指针的事情是(尤其是随着代码变得更加复杂),可能很难弄清楚谁负责对对象调用delete,而如果您有唯一的指针,我们马上就会知道,当指针删除时,删除将自动发生。指针超出范围。
© www.soinside.com 2019 - 2024. All rights reserved.