最近,我已经重新开始使用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;
}
答案 0 :(得分:1)
首先,您应该阅读the rule of three。
至于你的问题,因为对象被复制,并且因为你没有提供自己的拷贝构造函数,所以指针被“原样”复制,留下指向同一分配的多个副本记忆。当其中一个副本delete
在析构函数中分配了内存时,指针对所有副本都无效。
您可以通过实现复制构造函数和复制赋值运算符来解决问题。