C++ <;中的SmartPoint示例;C++;底漆>;第四,它抛出了一个垃圾堆

C++ <;中的SmartPoint示例;C++;底漆>;第四,它抛出了一个垃圾堆,c++,smart-pointers,C++,Smart Pointers,这些天我读了C++入门。昨晚,我写了一个关于smartpoint的演示,这是本书的一个例子。但是当我运行它时,它抛出了核心转储。我使用valgrind和gdb工具调试它,他们说关于free函数的错误,也就是说,删除了一个point对象两次。所以我阅读了代码并绘制了关于内存的图表,但是,我找不到错误 另外,我使用了作者的演示运行,它也犯了同样的错误。有人遇到过这个问题吗。这是详细的代码 #include <iostream> using namespace std; class U_

这些天我读了C++入门。昨晚,我写了一个关于smartpoint的演示,这是本书的一个例子。但是当我运行它时,它抛出了核心转储。我使用valgrind和gdb工具调试它,他们说关于free函数的错误,也就是说,删除了一个point对象两次。所以我阅读了代码并绘制了关于内存的图表,但是,我找不到错误

另外,我使用了作者的演示运行,它也犯了同样的错误。有人遇到过这个问题吗。这是详细的代码

#include <iostream>
using namespace std;

class U_Ptr {
    friend class HasPtr;
    private:
    int *m_pi;
    size_t use;
    U_Ptr(int *p)
        :m_pi(p),use(1)
    {
        cout << "U_Ptr(int *)" << endl;
    }
    ~U_Ptr()
    {
        cout << "~U_Ptr():use" << use << endl;
        delete m_pi;
    }
};

class HasPtr {
    public:
        HasPtr(int *p, int i)
            :ptr(new U_Ptr(p)), val(i)
        {
            cout << "HasPtr(int *, int)" << endl;
        }

        HasPtr(const HasPtr& rhs)
            :ptr(rhs.ptr), val(rhs.val)
        {
            cout << "HasPtr(const HasPtr&)" << endl;
            ++ptr->use;
        }

        HasPtr& operator=(const HasPtr& rhs)
        {
            cout << "operator=" << endl;
            ++rhs.ptr->use;
            if (--ptr->use == 0)
                delete ptr;
            ptr = rhs.ptr;
            val = rhs.val;
            return *this;
        }

        ~HasPtr()
        {
            cout << "~HasPtr():" << ptr->use << endl;
            if (--ptr->use == 0) {
                cout << "ptr->use:0 call ~U_Ptr()" << endl;
                delete ptr;
            }
        }

        int *get_ptr() const
        {
            return ptr->m_pi;
        }

        int get_int() const
        {
            return val;
        }

        void set_ptr(int *p)
        {
            ptr->m_pi = p;
        }

        void set_int(int i)
        {
            val = i;
        }

        int get_ptr_val() const
        {
            return *ptr->m_pi;
        }
        void set_ptr_val(int i) const
        {
            *ptr->m_pi = i;
        }
    private:
        U_Ptr *ptr;
        int val;
};

// here is test demo
int main(void)
{
    int obj = 0;
    HasPtr ptr1(&obj, 42);
    HasPtr ptr2(ptr1);


    int *tmp = new int(4);
    HasPtr ptr4(tmp,  44);

    ptr4 = ptr2;

    cout << "-------- change the ptr's value  ----------" << endl;
    int *pi = new int(42);

    HasPtr ptr3(pi, 10);

    ptr3.set_ptr_val(0);

    return 0;
}
#包括
使用名称空间std;
U类Ptr{
朋友类HasPtr;
私人:
int*m_pi;
不使用的尺寸;
U_Ptr(int*p)
:m_pi(p),使用(1)
{

cout这是导致问题的部分:

int obj = 0;
HasPtr ptr1(&obj, 42);
HasPtr的析构函数正在删除传递的参数int obj,该参数 实际上没有在堆中分配,只是一个局部变量

要解决此问题,可以如下更改代码:

int* obj = new int(0);
HasPtr ptr1(obj, 42);

建议:试着简化主要内容函数正在更好地隔离问题。版本不会崩溃。@nobar谢谢你的提示。错误来自主函数。谢谢你的帮助。但是你怎么能很容易地找到错误。我花了2个多小时来解决这个问题。但我也克服了它。只需查看你的参数。;)它需要多年的经验(笑)快乐的编码!