C++ C+中的崩溃+;代码

C++ C+中的崩溃+;代码,c++,crash,C++,Crash,我试图递归地列出目录中的所有文件。但是我的代码崩溃了,没有给出任何错误。当给定的文件是directory时,我递归调用该函数,或者打印其名称 我正在使用dirent.h int list_file(string path) { DIR *dir; struct dirent *ent; char *c_style_path; c_style_path = new char[path.length()]; c_style_path = (char *)pa

我试图递归地列出目录中的所有文件。但是我的代码崩溃了,没有给出任何错误。当给定的文件是directory时,我递归调用该函数,或者打印其名称

我正在使用dirent.h

int list_file(string path)
{
    DIR *dir;
    struct dirent *ent;
    char  *c_style_path;
    c_style_path = new char[path.length()];
    c_style_path = (char *)path.c_str();
    dir = opendir (c_style_path);
    if (dir != NULL) {

        /* print all the files and directories within directory */
        while ((ent = readdir (dir)) != NULL) {
            if(ent->d_type == DT_DIR && (strcmp(ent->d_name,".")!=0) && (strcmp(ent->d_name,"..")!=0))
            {
                string tmp = path + "\\" + ent->d_name;
                list_file(tmp);
            }
            else
            {
                cout<<ent->d_name<<endl;
            }
        }
        closedir (dir);
    } else {
        /* could not open directory */
        perror ("");
        return EXIT_FAILURE;
    }
    delete [] c_style_path;
    return 0;
}
int list_文件(字符串路径)
{
DIR*DIR;
结构导向;
字符*c_样式_路径;
c_style_path=新字符[path.length()];
c_style_path=(char*)path.c_str();
dir=opendir(c_样式_路径);
if(dir!=NULL){
/*打印目录中的所有文件和目录*/
while((ent=readdir(dir))!=NULL){
如果(ent->d_type==DT_DIR&&(strcmp(ent->d_name,“.”)=0)&(strcmp(ent->d_name,“…”)!=0))
{
字符串tmp=path+“\\”+ent->d\u name;
列表文件(tmp);
}
其他的
{
cout这就是原因:

c_style_path = (char *)path.c_str();
//...
delete[] c_style_path;
由于
delete[]
ing内存不应该这样做,并且当
path
在函数末尾超出范围时,可能会导致双重空闲

当您需要
const char*
时,只需使用
path.c_str()

dir = opendir (path.c_str());  
请注意,存储由
std::string::c_str()
返回的指针非常危险,因为如果
std::string
实例超出范围,它很容易导致指针悬空。

这就是原因:

c_style_path = (char *)path.c_str();
//...
delete[] c_style_path;
由于
delete[]
ing内存不应该这样做,并且当
path
在函数末尾超出范围时,可能会导致双重空闲

当您需要
const char*
时,只需使用
path.c_str()

dir = opendir (path.c_str());  

请注意,存储由
std::string::c_str()
返回的指针非常危险,因为如果
std::string
实例超出范围,它很容易导致指针悬空。

他还泄漏了
new char[path.length()]
同时。感谢hmjd的帮助。但我仍然怀疑为什么会发生这种情况,因为当我删除它时,我不再使用它。Benj这是如何导致泄漏的?@Ankuj,您确实为
c_style_path
分配了内存,但随后您将其指向
std::string
实例内部的缓冲区(分配没有复制内部字符串。)
std::string
实例将在调用其析构函数时删除其缓冲区,但发布的代码已将其删除。他还在泄漏
new char[path.length()]
同时。感谢hmjd的帮助。但我仍然怀疑为什么会发生这种情况,因为当我删除它时,我不再使用它。Benj这是如何导致泄漏的?@Ankuj,您确实为
c_style_path
分配了内存,但随后您将其指向
std::string
实例内部的缓冲区(分配没有复制内部字符串。)
std::string
实例将在调用其析构函数时删除其缓冲区,但发布的代码已将其删除。