gpt4 book ai didi

c++ - crt 检测到应用程序在堆缓冲区结束后写入内存

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:46 25 4
gpt4 key购买 nike

char* SequenceTokenAnalizer::NextToken(char delim){

int main()
{
SequenceTokenAnalizer st1("This is a test");
char* helpSequence;
helpSequence = st1.NextToken();
cout << helpSequence << endl;
delete[] helpSequence;
}

int i = currentindex, i2 = currentindex, cnt = 0, j = 0;
char *token=NULL;

if (Sequence[i2] == delim)
{
while (Sequence[i2] == delim&& Sequence[i2] != '\0')
{
i2++;

}
while (Sequence[i2] != delim&& Sequence[i2]!='\0')
{
cnt++;
i2++;
}
token = new char[cnt];
if (Sequence[i] == delim)
{
while (Sequence[i] == delim)
{
i++;

}
while (Sequence[i] != delim&& Sequence[i2] != '\0')
{
token[j] = Sequence[i];
i++;
j++;
}
token[j] = '\0';
currentindex = i;
return token;
}
}
else
{
while (Sequence[i2] != delim)
{
cnt++;
i2++;
}
token = new char[cnt];


if (Sequence[i] == delim)
{
while (Sequence[i] == delim)
{
i++;

}
while (Sequence[i] != delim)
{
token[j] = Sequence[i];
i++;
j++;
}
token[j] = '\0';
currentindex = i;
return token;
}
else
{
while (Sequence[i] != delim)
{
token[j] = Sequence[i];
i++;
j++;
}
token[j] = '\0';
currentindex = i;
return token;
}
}

类(class):

#包含

#包含

使用命名空间标准;

const int SIZE = 80;

类 SequenceTokenAnalizer {

char Sequence[SIZE];
char delimiter;
int currentindex;

公共(public):

SequenceTokenAnalizer(char str[]);

SequenceTokenAnalizer(char str[], char delim);

int LengthSequence();

int CountAllTokens();
void ResetTokens();
int CountTokens();
bool HasMoreTokens();
bool HasMoreTokens(char delim);
char* NextToken();
char* NextToken(char delim);
bool Equals(SequenceTokenAnalizer other);
bool NotEquals(SequenceTokenAnalizer other);
bool isCommonToken(SequenceTokenAnalizer other);
void PrintCommonTokens(SequenceTokenAnalizer other);

};

在 main 中使用 delete[] 后,我得到 crt 检测到应用程序在堆缓冲区结束后写入内存,请 helppppp 在这里我有序列并且必须从当前索引返回下一个 tokken在 main 中使用 delete[] 后,我得到 crt 检测到应用程序在堆缓冲区结束后写入内存,请 helppppp 在这里我有序列并且必须从当前索引返回下一个 tokken

最佳答案

您没有发布构造函数,但我假设 "This is a test" 是输入,' ' 是分隔符,currentindex=0。

现在按照代码

if (Sequence[i2] == delim)

这是错误的,因为 i2=0Sequence[0] 包含 'T'。所以跳到其他部分。

    while (Sequence[i2] != delim)
{
cnt++;
i2++;
}
token = new char[cnt];

i2 必须增加 4 倍才能到达空间。这意味着 cnt 也将是 4,并且您分配了 4 个字节。

    if (Sequence[i] == delim)

因为 i 从保存值开始为 i2 这总是错误的。所以再次转到其他部分

        while (Sequence[i] != delim)
{
token[j] = Sequence[i];
i++;
j++;
}
token[j] = '\0';

现在您正在将 "This" 复制到 4 字节的缓冲区中,但还在第 5 个位置写入 '\0'


在您编辑之前,您的代码包含这部分也是错误的:

token2 = new char[strlen(token)];
strcpy(token2, token);

strlen 返回不带 '\0' 的长度,但 strcpy 使用它。

此外,这看起来像是复制/粘贴错误:

while (Sequence[i] != delim&& Sequence[i2] != '\0')

我希望 i 而不是 i2

关于c++ - crt 检测到应用程序在堆缓冲区结束后写入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22269134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com