2015-03-04 2 views
0

Это код:C++ как выделить память указателю на структуру, которая является членом другой второй структуры?

# include<iostream> 
#include<stdio.h> 
using namespace std; 
    struct hub 
    { 
     int info; 
     int info2; 
    }; 
    struct hub2 
    { 
     hub *p; 
    }; 
    int main() 
    { 
     hub *pi; 
     pi = new hub; // allocate memory for pi 
     pi->info = 30; 
     pi->info2 = 45; 
     cout<<pi->info<<" "<<pi->info2; // shows 30 and 45 
     hub2 obj; // declare a hub2 data type 
     obj.p = new hub; // allocate memory for obj.p 
     obj.p = pi; // now obj.p should be identical to what pi points to right? 
     cout<<"\n"<<obj.p->info<<" "<<obj.p->info2; // This will show 30 and 45 
     cout<<endl; 
     delete pi; 
     cout<<"\n"<<obj.p->info<<" "<<obj.p->info2;//This shows random numbers,why ??? 
    } 

Почему не obj.p выделения памяти после того, как я удаляю памяти, выделенной для указателя пи? мне действительно нужно решение this.I должны закончить очень важный проект, и я застрял здесь с в этой памяти выделяя часть :(

+0

Вы удалили объект, на который указывает 'obj.p', теперь он является оборванным указателем, указывающим на нераспределенную (или потенциально повторно используемую) память. –

+0

Если вы хотите скопировать значения (потому что вы выделили 'obj.p = new hub;' тоже), используйте больше '*'. То есть. 'obj. * p = * pi;'. И иногда удалять вторую новую вещь. – deviantfan

ответ

0
obj.p = pi; // now obj.p should be identical to what pi points to right? 

Да, оба указателя теперь равны. Как следствие, delete pi эквивалентно delete obj.p. После того, как это сделано, заявление

cout<<"\n"<<obj.p->info<<" "<<obj.p->info2;//This shows random numbers,why ??? 

пытается получить доступ к памяти, который только что был освобожден. Это приводит к непредсказуемому поведению.

в качестве примечания, быть осторожны:

obj.p = new hub; // allocate memory for obj.p 
obj.p = pi; 

Второе утверждение перезаписывает указатель на память, выделенную на new hub. После этого такая память больше не доступна и не может быть освобождена. Это утечка памяти.

0

obj.p = новый концентратор; // Не нужно, вы можете напрямую писать obj.p = pi

удалить pi; // После этой инструкции pi свободен (НО НЕ АВТОМАТИЧЕСКИ ДОЛЖНО) pi указывает теперь на «мусор», поэтому вы видите случайное число.
Так что вам нужно перераспределить его снова.

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