gpt4 book ai didi

C++ valgrind 错误

转载 作者:行者123 更新时间:2023-11-28 07:21:49 26 4
gpt4 key购买 nike

我有一个简单的程序:

class stack{
public:
void push(int a);
void pop();
int isempty();
void init();
void clear();
int* stos;
int size;
private :
int top;

};

void stack::init(){

this->top=0;
this->size=10;
this->stos= reinterpret_cast<int*>(malloc(sizeof(int)*size));



}
void stack::push(int a){
this->top++;
this->stos[top-1]=a;
if((this->top)>(this->size))
{
this->size=2*(this->size);
this->stos=reinterpret_cast<int*>(realloc(this->stos,sizeof(int)*(this->size)));

}


}
void stack::pop()
{
this->top--;

this->stos[this->top]=0;



}
void stack::clear(){

free(this->stos);
this->top=0;

}
int stack::isempty(){
if((this->top)!=0)

return -1;
else return 1;




}
int main(int argc, char** argv) {
stack s1;
s1.init();
s1.clear();
printf("%d",s1.stos[12]);

return 0;

}

我是 cpp 初学者,valgrind 返回这样的错误:

==4710== Invalid read of size 4
==4710== at 0x80486D7: main (main.cpp:69)
==4710== Address 0x4325058 is 8 bytes after a block of size 40 free'd
==4710== at 0x402B06C: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4710== by 0x8048686: stack::clear() (main.cpp:51)
==4710== by 0x80486CF: main (main.cpp:68)
==4710==

如果主错误中没有 clear() 函数,将是相同的,但会说 40 alloc'd :)我很乐意提供任何帮助,谢谢。

最佳答案

当您这样做时,您正在访问尚未分配的内存:

printf("%d",s1.stos[12]);

在第一种情况下,您调用 s1.clear(),它释放(取消分配)s1.stos 的内存。

在第二种情况下(如果你摆脱了 clear()),你正在访问你只为其分配了 10 个元素的数组的第 12 个元素。

关于C++ valgrind 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346577/

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