Правильное перераспределение памяти в переполнении стека

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

class circuitTypes{

protected:
static int size;
circuitTypes **Matrix;
int input1,input2;
int output1, output2;

public:

circuitTypes() {};
static int getSize() { return size; };
static void upSize() { size++; };
void ItemRegistry();
virtual void setTruthTable()=0;
void setInputAndCalculateOutput(int a, int b);
int *getOutput();
};

int circuitTypes::size=0;

int *circuitTypes::getOutput(){
int Output[2];
Output[0]=output1;
Output[1]=output2;
return Output;
}
void circuitTypes::ItemRegistry(){

circuitTypes::upSize();
int circuitSize=circuitTypes::getSize();

if(circuitSize==1)
Matrix=(circuitTypes **)malloc(circuitSize*sizeof(circuitTypes *));
else
Matrix=(circuitTypes **)realloc(Matrix,circuitSize*sizeof(circuitTypes *));
if(Matrix==0){
std::cout <<"No available memory \n";
exit(1);
}
Matrix[circuitSize-1]=this;
}void circuitTypes::setInputAndCalculateOutput(int a, int b){
input1=a;
input2=b;
setTruthTable();
}class TypeA : private circuitTypes{

public:
TypeA() { ItemRegistry(); };
void setTruthTable();
};

void TypeA::setTruthTable(){
if (input1==0){
if (input2==0){
output1=0;
output2=0;
}
else{
output1=0;
output2=1;
}
}
else{
if (input2==0){
output1=0;
output2=1;
}
else{
output1=1;
output2=1;
}
}
}class TypeB : private circuitTypes{
public:
TypeB() { ItemRegistry(); };
void setTruthTable();
};

void TypeB::setTruthTable(){
if (input1==0){
if (input2==0){
output1=0;
output2=0;
}
else{
output1=0;
output2=1;
}
}
else{
if (input2==0){
output1=1;
output2=1;
}
else{
output1=0;
output2=1;
}
}
}

void circuit (circuitTypes **Example, int a, int b){
std::cout << "NIKKK";
Example[0]->setInputAndCalculateOutput(a,b);
int Size=Example[0]->getSize();
for (int i=1;i<Size;i++){

Example[i]->setInputAndCalculateOutput(Example[i-1]->getOutput()[0],Example[i-1]->getOutput()[1]);

}
std::cout << "For input a= " << a << " and b= " << b << " the result is c= " << Example[Size-1]->getOutput()[0] << " and d=" << Example[Size-1]->getOutput()[1] << "\n";
}int main (){

circuitTypes **Example;
TypeA A1,A2,A3;
TypeB B1,B2,B3;
for (int i=0;i<2;i++){

for (int j=0;j<2;j++){
circuit (Example,i,j);
}

}

}

Прошу прощения за размер кода, но, поскольку я понятия не имею, в чем проблема, я решил опубликовать всю программу. Файл .cpp скомпилирован без проблем в Ubuntu 11.10 (с g ++), но когда я пытаюсь выполнить файл a.out, я получаю эту ошибку:

* glibc обнаружен ./a.out: realloc (): неверный указатель: 0x003c2ff4 **

======= Backtrace: =========

/lib/i386-linux-gnu/libc.so.6(+0x721a2)[0x2b71a2]

/lib/i386-linux-gnu/libc.so.6(realloc+0x2a5)[0x2bb245]

./a.out[0x8048835]

./a.out[0x8048ca9]

./a.out[0x8048b2a]

/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0x25e113]

./a.out[0x80486c1]

======= Карта памяти: ========

00110000-0012c000 r-xp 00000000 08:06 1311674 /lib/i386-linux-gnu/libgcc_s.so.1

0012c000-0012d000 r — p 0001b000 08:06 1311674 /lib/i386-linux-gnu/libgcc_s.so.1

и т.п.

Может кто-нибудь мне помочь?

0

Решение

  1. Плохо устанавливать Matrix = realloc, так как вы никогда не сможете освободить его в случае сбоя realloc. Но вы все равно немедленно выходите, чтобы код не просочился, но это все еще плохая практика.
  2. Вы просто объявляете circuitTypes ** Example и используете его в схеме (Example, i, j) без выделения памяти для него. Вы, вероятно, хотите использовать Матрицу для этого.
  3. Это чистое предположение: то, как структурирован ваш код, заставляет меня думать, что вы хотите сделать Matrix статичной и использовать ее вместо Example.
0

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

   if(circuitSize==1)
Matrix=(circuitTypes **)malloc(circuitSize*sizeof(circuitTypes *));
else
Matrix=(circuitTypes **)realloc(Matrix,circuitSize*sizeof(circuitTypes *));

Я не понимаю if состояние здесь. Конечно, это должно быть if (Matrix == 0)? В противном случае вы рискуете попытаться realloc то, что вы никогда не имели mallocв первую очередь.

Но я согласен с @JerryCoffin, что вы должны выбросить его и использовать std::vector,

0

По вопросам рекламы [email protected]