2014-01-31 3 views
1

Недавно я возвращался к программированию на 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; 
} 
+1

Возможно, вы захотите определить конструктор копирования и операцию присваивания копии, или в этом случае просто используйте 'int' вместо указателя на' int'. – milleniumbug

+0

Благодарим вас за комментарий к оператору копирования и копирования. Об использовании указателя, приведенный выше код просто был тестом, который я создал, когда обнаружил ошибку в моем коде, которая касалась объектов, которым действительно нужен элемент-указатель на объект. –

ответ

1

Для начала вы должны прочитать о the rule of three.

Что касается ваших проблем, то это потому, что объекты скопированы, и поскольку вы не предоставляете свой собственный экземпляр-копию, указатель копируется «как есть», оставляя несколько копий, указывающих на одну и ту же выделенную память. Когда одна из этих копий delete выделенной памяти в деструкторе, указатель недействителен для всех копий.

Вы можете решить эту проблему, выполнив экземпляр-конструктор и оператор присваивания копий.

+0

Спасибо за ссылку и ответ. Это определенно решило проблему. Я буду помнить об этом в будущем –

Смежные вопросы