Недавно я возвращался к программированию на C++ и сталкивался с интересными, программируя что-то еще.Передача объекта функции, области и деструкторам
В приведенном ниже коде я определил класс с элементом-указателем, который удаляется в деструкторе класса.
Я также определил функцию, которая принимает объект Test_Object в качестве аргумента, который вызывает один из методов get_val(), который ничего не делает, но сообщает значение, хранящееся в адресе памяти, на который указывает указатель.
Теперь, когда я вызываю функцию дважды, она правильно печатает значение, удерживаемое внутренним указателем, правильно один раз, а затем только дампы ядра после второго.
Исправьте меня, если я ошибаюсь, но я считаю, что причина этого в том, что после первого вызова функции вызван деструктор объекта, вызванный тем, что объект вышел из сферы действия и по существу разрушен.
Единственный способ, которым я мог думать о предотвращении этого, - передать объект по ссылке. Есть ли другой способ предотвратить это? Кажется немного опасным просто передать объект по ссылке, поскольку объект может быть изменен в этом вызове функции, который позже может привести к головной боли.
Я попытался сделать аргумент const, однако я получаю сообщение об ошибке «const Test_Object» как «этот» аргумент «void Test_Object :: get_val()» отбрасывает квалификаторы argument.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;
}
Возможно, вы захотите определить конструктор копирования и операцию присваивания копии, или в этом случае просто используйте 'int' вместо указателя на' int'. – milleniumbug
Благодарим вас за комментарий к оператору копирования и копирования. Об использовании указателя, приведенный выше код просто был тестом, который я создал, когда обнаружил ошибку в моем коде, которая касалась объектов, которым действительно нужен элемент-указатель на объект. –