C++ 堆栈数组变量清理
我正在使用以下函数读取文件C++ 堆栈数组变量清理,c++,C++,我正在使用以下函数读取文件 void read_file(){ char buf[BUF_SIZE]; // file is a vraiable defined and assigned during initialization int numread = pread(file->fd, buf, BUF_SIZE, file->curpos); // other logic follows file->buffer += buf; } 仍然
void read_file(){
char buf[BUF_SIZE];
// file is a vraiable defined and assigned during initialization
int numread = pread(file->fd, buf, BUF_SIZE, file->curpos);
// other logic follows
file->buffer += buf;
}
仍然在同一类中的以下函数计算从文件读取的缓冲区的内容
void evaluate(){
read_file();
//evaluate the file->buffer contents
}
据我所知,当函数退出时,堆栈变量会自动“删除”,但我似乎无法理解为什么在连续调用evaluate()时,read_file()函数中的buf变量没有被清除
例如,如果我这样做
int main(){
evaluate(); // first call works as expected
evaluate(); // second call buf variable still has contents from previous call
return 0;
}
我希望你能给我一个解决这个问题的正确方向的提示。提前感谢。不管它值多少钱,都没有必要清理释放的内存。一旦它被释放并重新获得,其内容的状态将变为“不确定”。换句话说,它可能包含上次运行的数据,但这是绝对不必要的。你不能相信这一点 如果您感到困惑,建议您对缓冲区进行零初始化:
char buf[SIZE] = {};
你可以看看。不管它值多少钱,都没有必要清理释放的内存。一旦它被释放并重新获得,其内容的状态将变为“不确定”。换句话说,它可能包含上次运行的数据,但这是绝对不必要的。你不能相信这一点 如果您感到困惑,建议您对缓冲区进行零初始化:
char buf[SIZE] = {};
您可以查看。这是未定义的行为。C++没有“栈”的概念,这是平台特定的细节。通常,当您释放“堆栈空间”时,堆栈指针(即,
esp
。在x86上,堆栈向下增长)只是简单地递增。然而,这并不意味着堆栈上的内容会自动消失。您不能依赖未定义的行为,因为标准没有说明将发生什么,所以任何事情都是“有效”的结果。这是未定义的行为。C++没有“栈”的概念,这是平台特定的细节。通常,当您释放“堆栈空间”时,堆栈指针(即,esp
。在x86上,堆栈向下增长)只是简单地递增。然而,这并不意味着堆栈上的内容会自动消失。您不能依赖未定义的行为,因为标准没有说明将发生什么,所以任何事情都是“有效”的结果
我似乎无法理解为什么在连续调用evaluate()
时,read\u file()
函数中的buf
变量没有被清除
无论是在分配时还是在释放时强制始终清除内存可能会导致性能开销。但是,当初始化或释放内存时(即:在控件流离开声明buf
的封闭块之前),您可以自由地执行此操作
考虑到对
evaluate()
的N个连续调用与以下代码类似:
int main(){
evaluate(); // first call
evaluate(); // second call
...
evaluate(); // N call
return 0;
}
这意味着要清除该内存N次(考虑开销)
请注意,尽管上面对evaluate()
的所有调用都将使用堆栈上相同的内存空间,但在初始化之前读取内存会导致未定义的行为。通过这种方式,本标准对具有自动存储持续时间的清除数据不作任何要求
我似乎无法理解为什么在连续调用evaluate()
时,read\u file()
函数中的buf
变量没有被清除
无论是在分配时还是在释放时强制始终清除内存可能会导致性能开销。但是,当初始化或释放内存时(即:在控件流离开声明buf
的封闭块之前),您可以自由地执行此操作
考虑到对
evaluate()
的N个连续调用与以下代码类似:
int main(){
evaluate(); // first call
evaluate(); // second call
...
evaluate(); // N call
return 0;
}
这意味着要清除该内存N次(考虑开销)
请注意,尽管上面对
evaluate()
的所有调用都将使用堆栈上相同的内存空间,但在初始化之前读取内存会导致未定义的行为。通过这种方式,标准不会对具有自动存储持续时间的数据进行清除。首先,您的类中存在设计问题。
堆栈变量仅在它们声明的函数中有效。
因为堆栈指针可能有效,所以它们不能用于检查。
每次阅读时使用分配的缓冲区(new
、malloc()
、HeapAlloc()
或其他函数
void evaluate(){
char *buf = new char[BUF_SIZE];
read_file(buf);
//evaluate the file->buffer contents
delete [] buf;
}
及
这将有助于解决您的问题,但下一个问题将出现在
文件->缓冲区+=buf;
中。应该考虑其他复制数组的方法。首先,您的类中存在设计问题。
堆栈变量仅在它们声明的函数中有效。
因为堆栈指针可能有效,所以它们不能用于检查。
每次阅读时使用分配的缓冲区(new
、malloc()
、HeapAlloc()
或其他函数
void evaluate(){
char *buf = new char[BUF_SIZE];
read_file(buf);
//evaluate the file->buffer contents
delete [] buf;
}
及
这将有助于您回答问题,但下一个问题将出现在
文件->缓冲区+=buf;
中。应该考虑其他复制数组的方法。您没有初始化数组。它们有未指定的内容。文件->缓冲区+=buf
有什么作用???确定是+=/code>?内存已释放但未清除。如图所示你可以做一些像charbuf[buf_SIZE]={0};用零初始化它销毁变量的内容不必立即消失。可能的重复变量没有初始化它们。它们有未指定的内容。文件->缓冲区+=buf
做什么呢???确定它是+=
?内存已释放但未清除。您看到的是“垃圾”。您可以执行char buf[buf_SIZE]={0};之类的操作,以用零初始化它。已销毁变量的内容不必立即消失。可能是