c ++ неверный указатель / двойное освобождение класса с членом массива - PullRequest
0 голосов
/ 30 июня 2018
#include <iostream>

using namespace std;

const int ALPHABET = 26;
const int LANG = 4;

const double TOLK[LANG][ALPHABET]= {{0}};

class Text
{
private:
  string sample;
  int* histogram;
  double* rel_histogram;
  int sample_size;

public:
  Text();
  ~Text();
  string parse();
};

string parsing(const double TOLK[][ALPHABET], double rel_occurence_arr[]);

int main()
{
  Text myText;
  myText.parse();

  return 0;
}

Text::Text(){
  sample = "";
  histogram = new int[ALPHABET];
  rel_histogram = new double[ALPHABET];
  sample_size = 0;
}

Text::~Text(){
  delete[] histogram;
  delete[] rel_histogram;
}

string Text::parse(){
  parsing(TOLK, rel_histogram);
  //Invalid pointer here
}

string parsing(const double TOLK_HJALP[][ALPHABET], double rel_occurence_arr[]){
  return "test";
}

Это часть большого кода, но я очистил все, что мог, пока остались только части, вызывающие ошибку. Его запуск приводит к ошибке неверного указателя, а запуск со всеми дополнительными битами приводит к двойной ошибке освобождения / повреждения. Но я думаю, что если я смогу понять это на этом уровне, я, вероятно, смогу понять это в более широком масштабе.

Из того, что я собрал, я думаю, что класс Text пытается удалить то, что уже было удалено, когда функция синтаксического анализа вернулась. Я не знаю, правильно ли это, но если это так, я понятия не имею, как это предотвратить. Не имеет значения, отправляю ли я копию (как я пытался, может быть, есть больше способов, чем один?).

Кроме того, удаление iostream из списка включений, по какой-либо причине, устраняет ошибку. Это почему? Это даже не используется здесь?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 июня 2018

Есть две проблемы с вашим кодом, которые я вижу.

(1) Это должно быть причиной вашей ошибки. Вы не включаете string, и iostream не нужно включать его. Это означает, что вы возвращаете указатель на символ из parsing, но указатель удаляется при возврате parsing. Это приводит к неопределенному поведению.

(2) parse не возвращает значение, но обещает в своем объявлении. Это может вызвать некоторые проблемы.

Примечание: вы должны попытаться использовать -Wall, когда столкнетесь с проблемой (или просто постоянно). Это поймало бы обе эти ошибки для вас.

...