указатели — указатель на переполнение стека внешнего класса

Здесь я пытаюсь создать иерархию N-го уровня, но не позволяю мне указать на внешний класс внутреннего класса и получить ошибку нарушения доступа. Но последняя версия работает.

В чем моя ошибка? Это о сфере применения вновь созданных внутренних циклов? Но они созданы внутри класса, так что это не должно быть проблемой, не так ли?

 // atom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"#include<iostream>
#include<stdlib.h>

class a
{
public:
int x;
a * inner;
a * outer;
a(int n)   //creates an inner a
{
n--;
x=n;
if(n>0){inner=new a(n);}else{inner=NULL;}
inner->outer=this;//Unhandled exception at 0x004115ce in atom.exe: 0xC0000005:
//Access violation writing location 0x00000008.
}

};

int main()
{
a * c=new a(5);
a * d=c;
while((d->inner))     //would print 4321 if worked
{
std::cout<<d->x;
d=d->inner;
}
getchar();
delete c;
d=NULL;
c=NULL;
return 0;
}

Но это работает:

// atom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"#include<iostream>
#include<stdlib.h>

class a
{
public:
int x;
a * inner;
a * outer;
a(int n)   //creates an inner a
{
n--;
x=n;
if(n>0){inner=new a(n);inner->outer=this;}else{inner=NULL;}
//works without error
}

};

int main()
{
a * c=new a(5);
a * d=c;
while((d->inner))     //prints 4321
{
std::cout<<d->x;
d=d->inner;
}
getchar();
delete c;
d=NULL;
c=NULL;
return 0;
}

Как вы думаете, все они автоматически удаляются, когда я просто удаляю c?

0

Решение

Когда вы делаете это:

if(n>0)
{
inner=new a(n); //first n is 4, then 3,2,1 and then 0
}
else
{
inner=NULL;
}
inner->outer=this;

состояние n>0 в итоге не удержится (при 5-м звонке), поэтому inner будет NULLи затем вы впадаете в неопределенное поведение (и падение), когда пытаетесь разыменовать его (inner->outer).

4

Другие решения

Эта строка:

inner->outer=this

должен быть внутри if (n > 0) филиал, после inner = new a(n) линия, например:

a(int n) : inner(0), outer(0) // set data members here
{
x = --n;
if (n > 0) {
inner = new a(n);
inner->outer = this;
}
}

Как написано, когда n == 0 вам гарантировано исключение нулевого указателя при попытке установить NULL->outer = this,

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector