作为一个学校练习的发展,我正在做一个程序,它从程序执行的位置开始,在每个子文件夹中写入一个文件,所以有一个递归函数和另一个在里面调用的函数来写入文件。
如果我执行此命令,则在第二次写入文件时会出现“exited with code=3221226356”错误(在第一个子文件夹中,当我创建ofstream时)...只有在不调试时。经过一些实验后,我删除了递归调用,并将文件写入所有主目录。除了输入变量外,没有数组(char*),什么可能导致此内存泄漏?
这是代码:
#include <dirent.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <time.h>
#include <limits.h>
const char * separator_char() {
#ifdef _WIN32
return "\\";
#else
return "/";
#endif
}
void createCopy(const char * path) {
const char * separator = separator_char();
char * file_name_path = strdup(path);
strcat(file_name_path, separator);
printf("Writing Roberto.txt...\n");
strcat(file_name_path, "Roberto.txt");
std::ofstream dst(file_name_path, std::ios::binary | std::ofstream::trunc); -- ERROR HERE
dst << "test";
printf("Wrote %s\n", file_name_path);
dst.close();
}
void multiply(const char * path) {
const char * separator = separator_char();
char * path_2 = strdup(path);
strcat(path_2, separator);
DIR * dir = opendir(path);
struct dirent * entry = readdir(dir);
while (entry != NULL) {
if (strcmp(entry -> d_name, ".") != 0 && strcmp(entry -> d_name, "..") && entry -> d_type == DT_DIR) {
char * path_3 = strdup(path_2);
strcat(path_3, entry -> d_name);
printf("%s\n", path_3);
createCopy(path_3);
multiply(path_3);
}
entry = readdir(dir);
}
closedir(dir);
}
int main(int argc, char ** argv) {
const char * PATH = ".";
multiply(PATH);
getchar();
return 0;
}
1条答案
按热度按时间62lalag41#
以下两行可能会出现问题:
strdup
调用为要复制的字符串分配足够的内存,而不是多分配一个字节。这意味着
strcat
调用将导致您的程序写入超出分配内存边界的pout,从而导致 undefined behavior(和堆损坏)。一个可能的类似C语言的解决方案是使用
snprintf
函数来构造你的字符串。它可以与一个空指针目标字符串和一个零大小一起使用,然后将返回字符串所需的字节数(不包括空终止符)。然后你可以为字符串分配内存,并再次使用snprintf
来实际创建字符串。或者,既然你是在编写C++,那么就使用
std::string
并根据需要追加。没有越界问题,没有内存泄漏(你也有)。考虑到您要处理的是文件系统路径,请改用
std::filesystem::path
: