将对象传递给函数,作用域和析构函数

时间:2014-01-31 16:03:03

标签: c++ oop

最近,我已经重新开始使用C ++进行编程,并且在编写其他内容时遇到了有趣的事情。

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

我还定义了一个函数,该函数将Test_Object对象作为参数调用get_val()方法之一,该方法不执行任何操作,但报告指针所指向的内存地址中保存的值。

现在当我调用该函数两次时,它正确地打印了内部指针所保持的值一次,然后只是在第二次之后才进行核心转储。

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

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

我已尝试将参数设为const,但是我得到一个错误,指出'const Test_Object'为'void Test_Object :: get_val()的'this'参数'丢弃限定符参数.get_val();

#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;
}

1 个答案:

答案 0 :(得分:1)

首先,您应该阅读the rule of three

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

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