C++ 在具有数组成员的类上无效指针/双精度释放

c++ invalid pointer/double free on class with array member

本文关键字:无效 指针 释放 双精度 数组 组成员 C++      更新时间:2023-10-16
#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(这应该是导致错误的原因。您不包括stringiostream也不需要包含它。这意味着您将从parsing返回指向 char 的指针,但当parsing返回时,该指针将被删除。这会导致未定义的行为。

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

注意:当您遇到问题时,您应该尝试使用-Wall(或一直使用(。这会为您捕获这两个错误。