Проблемы памяти в массиве двухмерных объектов Переполнение стека

Когда мой вклад выглядит так:

11

Гарри Кейт Фред Кэрол

Моя матрица смежности должна поставить Гарри на [7] [7], Кейт на [7] [10], Фред на [7] [5] и Кэрол на [7] [2]. Тем не менее, Кэрол & Кейт вставляют в других местах в прил. матрица также. Я предполагаю, что это как-то связано со стеком и кучей памяти, но я не уверен, как найти ошибку. При использовании инструкций cout проблем не возникает.

Код ниже

#include <iostream>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <sstream>
using namespace std;

class Element {

public:
string name;
int weight;
string color;

//default constructor
Element(void) {
name = "";
weight = 0;
color = "white";
}

//parameterized constructor
Element(string first) {
name = first;
weight = 0;
color = "white";
}

void setBlack() {
color = "black";
}
};

class AdjMatrix {

public:
int size;
Element ***adj_matrix;
AdjMatrix(void) {
size = 0;
adj_matrix = NULL;
}

AdjMatrix(int n) {
size = n; //sets the size to n
adj_matrix = new Element **[size];
for (int i = 0; i < size; i++) {
adj_matrix[i] = new Element *[i];
}
}

//Destructor class
~AdjMatrix(void) {
delete adj_matrix;
adj_matrix = NULL;
}

//initialize the array with empty elements
void initialize_matrix() {
Element *add_element = new Element("");
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
adj_matrix[i][j] = add_element;
}
}
};int convertToASCII(string letter)
{
int x = letter.at(0);
int index = x - 65;
return index;
};

int main(int argc, char *argv[]) {

string table_size;
cout<<"";
getline(cin,table_size);
int size = atoi(table_size.c_str());
AdjMatrix *myGraph = new AdjMatrix(size);
myGraph->initialize_matrix();

string line;
getline(cin, line);
while (getline(cin,line))
{
if (line.empty())
break;

else {

int x = convertToASCII(line);
stringstream linestream(line);
string temp;

while (linestream >> temp) {
int z = convertToASCII(temp);
myGraph->adj_matrix[x][z] = new Element(temp);
}
}
}

//Print graph
for (int i = 0; i < myGraph->size; i++) {
for (int j = 0; j < myGraph->size; j++)
cout<<"["<<i<<"]["<<j<<"]: "<<myGraph->adj_matrix[i][j]->name<<endl;
}

return 0;
}

0

Решение

Ваша программа имеет следующую проблему, которая должна быть исправлена.

 //default constructor
Element(void)

Конструктор должен быть определен как

 //default constructor
Element()
  • Вы должны начать использовать станд :: вектор для вашего 2D массива. Это исключило бы ручное управление памятью. Мы должны избегать использования необработанных указателей в современном c ++. Пожалуйста, обратитесь к следующему SO сообщению, которое описывает, как использовать вектор для 2D-массива.

двумерный массив с использованием вектора в cpp

1

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

В вашем AdjMatrix(int) ctor, вы неправильно строите свою треугольную матрицу (если это то, к чему вы стремитесь). Попробуй это:

AdjMatrix(int n) {
size = n; //sets the size to n
adj_matrix = new Element **[size];
for (int i = 0; i < size; i++) {
adj_matrix[i] = new Element *[i + 1]; // Or size for a square matrix
}
}
0