C + +无效指针/双精度释放与数组成员的类

时间:2018-06-30 15:05:36

标签: c++ arrays class double free

#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 :(得分:0)

我的代码有两个问题。

(1)这应该是导致您的错误的原因。您不包括string,并且iostream不需要包括它。这意味着您正在从parsing返回指向char的指针,但是当parsing返回时该指针将被删除。这将导致不确定的行为。

(2)parse不会返回值,但会在其声明中承诺。这可能会导致一些问题。

注意:遇到问题时(或一直),您应该尝试使用-Wall。那将为您抓住这两个错误。