2012-01-25 4 views
2

У меня есть следующий псевдокод:C++ ссылка на указатель

function1()//Gets called on startup 
{ 
    myclass* obj; 
    function2(obj); 
    obj->doSomething();//crashes here! 
} 

function2(myclass*& ret) 
{ 
    myclass* nobj = &myclass(); 
    nobj->doSomething();//Does not crash 
    ret = &nobj; 
} 

Казалось бы, что даже если я устанавливаю в отставке, чтобы указать на nobj, когда я пытаюсь работать на OBJ (который должен быть направлен на nobj, поскольку ret - ссылка на obj), моя программа вылетает! Ясно, что я делаю что-то неправильно, кто-нибудь знает, что это такое?

+1

Где 'ret' объявлен? –

+0

@ Mr.TAMER function2 (myclass * & ret) –

+0

Кажется, мне нужно больше спать! –

ответ

7

Вы принимаете адрес временного действия, делая &myclass(), что является no-no, поскольку временное уничтожается в конце выражения, и ваш компилятор не должен его допускать.

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

Кроме того, я не знаю, как вы присваиваете указатель на указатель на myclass (&nobj) к указателю на myclass (ret). Он не должен компилироваться.

+0

Мы снова встречаемся! Интересно. Тогда мне нужно будет использовать новое, и просто не забудьте освободить его, когда я покончу с этим? –

+0

@GeorgesOatesLarsen да или более предпочтительно использовать 'new' с умными указателями, поэтому вам не нужно беспокоиться о его очистке –

+0

Ага, еще раз спасибо :) Я согласен с вами через 8 минут. –

2

попробуйте:

myclass *obj = new myclass(); 
obj->doSomething(); 
delete obj; 
+1

На этом этапе используйте интеллектуальный указатель. – GManNickG

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