将对象传递给函数、作用域和析构函数 最近我回到了C++编程中,在编程其他东西时,它变得有趣了。
在下面的代码中,我定义了一个具有指针成员的类,该成员在类的析构函数中被删除 我还定义了一个函数,该函数将一个Test_对象作为一个参数,该参数调用一个get_val()方法,该方法只报告指针指向的内存地址中的值 现在,当我调用函数两次时,它会正确地打印内部指针所持有的值一次,然后在第二次之后,核心转储 如果我错了,请纠正我,但我相信发生这种情况的原因是,在第一次调用函数之后,调用了对象的析构函数,因为对象已超出范围,并且基本上已被销毁 我能想到的防止这种情况的唯一方法是通过引用传递对象。有没有其他方法可以防止这种情况发生?简单地通过引用传递对象似乎有点危险,因为在该函数调用中可以修改对象,这可能会导致以后的麻烦 我已尝试将参数设置为常量,但出现了一个错误,指出“const Test_Object”作为“void Test_Object::get_val()”的“this”参数会丢弃限定符参数。get_val()将对象传递给函数、作用域和析构函数 最近我回到了C++编程中,在编程其他东西时,它变得有趣了。,c++,oop,C++,Oop,在下面的代码中,我定义了一个具有指针成员的类,该成员在类的析构函数中被删除 我还定义了一个函数,该函数将一个Test_对象作为一个参数,该参数调用一个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;
}