【发布时间】:2013-08-19 19:42:32
【问题描述】:
所以标题是我的问题。在内存中,参数可以位于堆栈或堆中,具体取决于它们的初始化方式,但如何处理硬编码信息?
例如,我将使用ifstream的构造函数
这有什么区别:
void function(){
ifstream infile("home/some/file/path");
}
对
void function(char* filePath){
ifstream infile(filePath); //filePath points to a character array which contains home/some/file/path
}
是否会因使用其中一个而产生任何记忆影响? (如果 char* 未正确释放,多线程可能会导致堆损坏?等等)。
我只是想了解差异和可能的含义,以便将答案应用于更大的问题。欢迎所有见解,如果我做出任何不正确的陈述/假设,请随时纠正我!
【问题讨论】:
-
真的取决于
filePath是什么以及它是如何创建的。但是堆损坏不是由不是free'd 引起的。堆损坏是由于在其分配的缓冲区之外写入错误代码造成的。 -
在您的第一个示例中,字符串将被放入进程的只读区域。所以那里没有什么可以造成损害的。
-
@MatsPetersson 如果你不介意我问,有多少种不同的方式来定义
char*?我知道你可以做char* foo = (char*)malloc(16)之类的事情,但还有什么其他的,比如流行的,有哪些方法,它会如何影响记忆? -
例如,您可以调用
function("home/some/file/path")[虽然从技术上讲它应该是const- 但如果您直接将它传递给ifstream,这不是问题)。可能是char str[] = "some/file/path; function(str); ",也可能是main中的function(argv[2])。这远不是一个完整的列表,但评论中只有这么多空间。char *可以通过多种方式出现在您的function中。 -
@bash.d 如果
char指针只指向一个字符数组并且从未“编辑”过,本质上只是用作文件路径,那么数据被指向的可能方式有哪些改变? (可能有些函数写的越界?)
标签: c++ heap-memory stack-memory hardcode