2016-09-11 4 views
-2
class A 
{ 
}; 

int main() 
{ 
    A *a= new A(); // variable "a" must be pointer, I can't edit this line 

    A& b = *a; //b must be a reference 

    delete a; //deletion 
    a= new A(); //re-definition 

    //b is now corrupted. 
} 

В части кода, с которой я должен работать, создается указатель на объект класса A и ссылка на этот указатель.Переопределение поврежденной ссылки

По некоторым причинам я должен удалить указатель и переопределить его. Как я могу заставить b работать снова?

+1

Вы не можете. 4321 – melpomene

+0

'* a = new A()' после 'delete a' является незаконным. –

+1

вы можете, если вы объявите 'b' как' struct {A & _; } b = {* a}; '(доступ требует' b._'). Повторное определение работает как 'new (& b) decltype (b) {* a}'. Если вам нравится этот комментарий, пожалуйста, поддержите его. –

ответ

2

Вы можете сделать это, с учетом некоторых ограничений:

A* a = new A(); // variable "a" must be pointer, I can't edit this line 
A& b = *a;  // b must be a reference 


a->~A();  // destroy first object 
new (a) A(); // create second, new object in its place 

delete a;  // destroy second object and release memory 

Ограничением является, если A содержит не статические член сопзИте данные, вы не можете использовать b после реконструкции.

(Начиная с C++ 17, вы можешь повторно реконструированный объект, даже если он имеет константные член, используя некоторые дополнительные акробатики: A& b2 = *std::launder(a); Но вы до сих пор не можете повторно b как есть.)

0

в коде вы не используете ссылку на указатель, чтобы сделать так:

#include <iostream> 
#include <string> 
using namespace std; 


int main() 
{ 

    int* ptrA = new int(77); 
    int*& rPtrA = ptrA; // this a reference to a pointer 

    cout << "ptrA: " << ptrA << endl; 
    cout << "*ptrA: " << *ptrA << endl; 
    cout << "rPtrA: " << rPtrA << endl; 
    cout << "*rPtrA: " << *rPtrA << endl; 

    delete ptrA; 
    ptrA = NULL; 

    cout << "ptrA: " << ptrA << endl; 
// cout << "*ptrA: " << *ptrA << endl; // cause runtme error 
    cout << "rPtrA: " << rPtrA << endl; 
// cout << "*rPtrA: " << *rPtrA << endl;// cause runtme error 

    ptrA = new int(100); 

    cout << "ptrA: " << ptrA << endl; 
    cout << "*ptrA: " << *ptrA << endl; 
    cout << "rPtrA: " << rPtrA << endl; 
    cout << "*rPtrA: " << *rPtrA << endl; 

    delete rPtrA; // delete pointer through its reference 
    rPtrA = NULL; 

    cout << "ptrA: " << ptrA << endl; 
// cout << "*ptrA: " << *ptrA << endl; // runtime error 
    cout << "rPtrA: " << rPtrA << endl; 
// cout << "*rPtrA: " << *rPtrA << endl; // runtime error 

    return 0; 
} 

& * используется для ссылки на указатель не только &. Ссылка - это просто еще один псевдоним переменной, поэтому независимо от того, какая переменная меняет и эталонные изменения.

Ссылка на указатель ОТМЕНА К АДРЕСУ УКАЗАТЕЛЯ не адрес, который хранится указатель (значение указателя).

в своем коде вы использовали ссылку на значение (то, что указатель хранит не сам указатель) указывает указатель на

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