Title几乎说明了一切,我几乎可以肯定,它是在复制构造函数中还是在赋值运算符中,而且我很确定它是后者。这是一个很短的类(class),所以我将发布整个内容,关于如何处理它的任何建议都是很好的。老实说,我在这里也有点不知所措,因此,任何指向可靠阅读的指导都将不胜感激。

#pragma once

//for non-learning purposes, boost has a good smart pointer
template <class type>
class sPtr
{
private:
    type *p;
    int r; //referenceCount

    void add()
    {
        r++;
    }
    int release()
    {
        return --r;
    }
public:
    sPtr(): p(NULL), r(1) {}
    sPtr(type *pValue): p(pValue)
    {
        add();
    }
    sPtr(const sPtr<type> & sp): p(sp.p), r(sp.r)
    {
        add();
    }
    ~sPtr()
    {
        if(release() == 0)
        {
            delete p;
        }
    }

    type* get()
    {
        return p;
    }

    type& operator*()
    {
        return *p;
    }
    type* operator->()
    {
        return p;
    }
    sPtr<type>& operator=(sPtr<type> sp)
    {
        std::swap(this->p, sp.p);
        std::swap(this->r, sp.r);
        add();

        return *this;
    }
};

我很确定应该通过引用传递赋值运算符,但是我不确定这将如何影响实现。我尝试了几种不同的实现,但所有实现仍然存在泄漏。

最佳答案

您的每个共享指针都跟踪其自己的独立引用计数。这显然是不好的。当一个销毁时,其他编号的引用计数不会更新。您需要将引用计数保留在所有共享指针均可访问的单独位置。

关于c++ - 在共享指针中捕获内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18383201/

10-11 21:28