将对象传递给函数、作用域和析构函数 最近我回到了C++编程中,在编程其他东西时,它变得有趣了。

将对象传递给函数、作用域和析构函数 最近我回到了C++编程中,在编程其他东西时,它变得有趣了。,c++,oop,C++,Oop,在下面的代码中,我定义了一个具有指针成员的类,该成员在类的析构函数中被删除 我还定义了一个函数,该函数将一个Test_对象作为一个参数,该参数调用一个get_val()方法,该方法只报告指针指向的内存地址中的值 现在,当我调用函数两次时,它会正确地打印内部指针所持有的值一次,然后在第二次之后,核心转储 如果我错了,请纠正我,但我相信发生这种情况的原因是,在第一次调用函数之后,调用了对象的析构函数,因为对象已超出范围,并且基本上已被销毁 我能想到的防止这种情况的唯一方法是通过引用传递对象。有没有其

在下面的代码中,我定义了一个具有指针成员的类,该成员在类的析构函数中被删除

我还定义了一个函数,该函数将一个Test_对象作为一个参数,该参数调用一个get_val()方法,该方法只报告指针指向的内存地址中的值

现在,当我调用函数两次时,它会正确地打印内部指针所持有的值一次,然后在第二次之后,核心转储

如果我错了,请纠正我,但我相信发生这种情况的原因是,在第一次调用函数之后,调用了对象的析构函数,因为对象已超出范围,并且基本上已被销毁

我能想到的防止这种情况的唯一方法是通过引用传递对象。有没有其他方法可以防止这种情况发生?简单地通过引用传递对象似乎有点危险,因为在该函数调用中可以修改对象,这可能会导致以后的麻烦

我已尝试将参数设置为常量,但出现了一个错误,指出“const Test_Object”作为“void Test_Object::get_val()”的“this”参数会丢弃限定符参数。get_val()

#包括
使用名称空间std;
类测试对象
{
私人:
int*内部_指针;
公众:
测试对象(int值)
{
内部指针=新整数;
*内部指针=值;
}
~Test_Object()
{
删除内部_指针;
内部指针=NULL;
}

void get_val(){cout首先,您应该了解

至于您的问题,这是因为对象被复制,并且由于您没有提供自己的复制构造函数,指针被“按原样”复制,留下指向同一分配内存的多个副本。当其中一个副本
delete
析构函数中分配的内存时,指针对于所有副本都无效


您可以通过实现复制构造函数和复制赋值运算符来解决此问题。

您可能需要定义复制构造函数和复制赋值运算符,或者在这种情况下,只需使用
int
而不是指向
int
的指针。感谢您对复制和复制赋值运算符的评论。关于指针的使用,上面的代码只是我在代码中发现一个bug时创建的一个测试,该bug处理的对象确实需要一个指向对象的指针成员。感谢您提供的链接和答案。这肯定解决了问题。我以后会记住这一点
#include <iostream>

using namespace std;

class Test_Object
{
    private:
    int *internal_pointer;
    public:
    Test_Object(int value)
    {
        internal_pointer = new int;
        *internal_pointer = value;
    }
    ~Test_Object() 
    {
        delete internal_pointer;
        internal_pointer = NULL;
    }
    void get_val() { cout<<*internal_pointer<<endl; }
};

void test_outsider(Test_Object argument)
{
    argument.get_val();
}

int main()
{
    Test_Object test = Test_Object(4);
    test_outsider(test);
    test_outsider(test);
    return 0;
}