C++ 脏字符*
Posted
技术标签:
【中文标题】C++ 脏字符*【英文标题】:C++ dirty char* 【发布时间】:2014-05-20 20:13:06 【问题描述】:我有这个功能可以读取目录中的照片:
vector<Mat> vImg;
Mat rImg;
DIR *dir;
struct dirent *file;
int count = 0;
std::vector<char*> arr;
if(argc >= 2)
char* imgFolder = argv[1];
if ((dir = opendir(imgFolder)) != NULL)
while ((file = readdir(dir)) != NULL)
std::string fn = file->d_name;
std::string ext = StringToUpper(fn.substr(fn.find_last_of(".") + 1));
if(ext == "JPG" || ext == "PNG" || ext == "JPEG")
count += 1;
char* itm = new char[100];
strcat(itm, imgFolder);
strcat(itm, "/");
strcat(itm, file->d_name);
printf("%s\n",itm);
vImg.push_back(imread(itm));
closedir (dir);
问题是在第一个之后
vImg.push_back(imread(itm));
所有其他“itm”都像这样弄脏:
有人可以帮帮我吗? 谢谢! :)
【问题讨论】:
您将 c_strings 与 std::vectors 和 std::strings 混合的任何特殊原因? 我不知道这是否是您的实际代码,但您有内存泄漏,因为您不断分配 100char
s 的缓冲区并且从不删除它。
我不认为这是泄漏,他可能将它们存储在向量中以供以后使用(并希望也可以释放它们)。
另外 100 个字符不一定足够。如果路径和/或文件名特别长,您可能会遇到缓冲区溢出。
在这些情况下通常使用PATH_MAX
或MAX_PATH
(取决于平台)。
【参考方案1】:
你的错误在这里:
char* itm = new char[100];
strcat(itm, imgFolder); // <-- oops
第一个strcat
应该是strcpy
。否则,您将追加到未初始化的内存中。
此外,您永远不会在任何地方删除 char
数组。
【讨论】:
与delete[]
。不是delete
。以上是关于C++ 脏字符*的主要内容,如果未能解决你的问题,请参考以下文章