【问题标题】:Program crashes at printing string vector打印字符串向量时程序崩溃
【发布时间】:2014-03-31 04:28:02
【问题描述】:

我正在编写一个编写和读取“提醒”的程序,当我打印一个带有“提醒”的字符串向量时,它崩溃了,我不知道为什么会发生这种情况,它可以编译,但是它运行时崩溃,感谢任何试图提供帮助的人。代码如下:

vector<string> v = ReadFile();
for(vector<string>::iterator i = v.begin();i != end();i++) {
    cout << *i << '\n' << endl;
}

代码的另一个“版本”,也会崩溃:

vector<string> v = ReadFile();
for(int i = 0;i < v.size();i++) {
    cout << v[i] << '\n' << endl;
}

对不起,如果退出另一个有同样问题的线程。

PS:我使用 MinGW 作为编译器

完整代码在这里:

#include <iostream> // Basic IO
#include <fstream> // File IO
#include <stdlib.h> // free()
#include <vector> // For using vectors
#include <string> // For strings
#include <dirent.h> // Read files from folders
#include <windows.h> // GetCurrentDirectory()

void WriteFile(string desc) { 
    ofstream write(desc.c_str());
    write << "Created on: " << __DATE__ << " " << __TIME__ << "\n";
    write.close();
    printf("\nReminder saved with success");
}

vector<string> ReadFile () { 
    vector<string> reminders; 
    DIR *dir; 
    struct dirent *ent;
    LPSTR buffer;
    GetCurrentDirectory(MAX_PATH, buffer);
    if((dir = opendir(buffer)) != NULL) { 
        while((ent = readdir(dir)) != NULL) { 
            reminders.push_back(ent->d_name);
        }
        closedir(dir);
        free(dir);
        free(ent);
        free(buffer);
    } else {
        printf("\nError at reading folder or empty folder");
    }
    return reminders;
}

int main() {
    vector<string> v = ReadFile();
    for(int i = 0;i < v.size();++i) {
        cout << v[i] << '\n' << endl;
    }
    return  0;
}

【问题讨论】:

  • 您上面的代码看起来是正确的,其他地方可能有问题可能是 ReadFile().... 您应该检查程序中的其他函数。
  • 不确定是不是拼写错误,但您的意思是v.end()?或者这可能是你的问题?另外,建议将i++ 更改为++i,因为大多数迭代器更普遍地支持这种方法。不过,我认为这不是你的问题,因为 vector&lt;t&gt;::iterator 支持两者。
  • 好吧,当我只创建向量时,它运行良好(ReadFile() 工作正常),但是当我打印时会导致崩溃。当我在第一个代码中使用 ++i 而不是 i++ 时,编译器给了我一个很长的错误(我可以看到错误的开始),在第二个代码中它崩溃了。 ://
  • 提供一个完整的、可编译的示例来演示该问题。仅仅因为在添加特定代码之前问题不会出现,并不意味着刚刚添加的代码就是问题。
  • @DJPeterson 所有迭代器都支持两种形式的 ++。 ++i 可能比 i++ 更高效,具体取决于编译器。

标签: c++


【解决方案1】:

这是个问题:

LPSTR buffer;
GetCurrentDirectory(MAX_PATH, buffer);

LPSTRchar * 或类似的类型定义。但是,GetCurrentDirectory 函数需要传递一个已分配的缓冲区。改为:

char buffer[MAX_PATH+1];   // or TCHAR
GetCurrentDirectory(sizeof buffer, buffer);

另外,你不应该打电话给free(buffer),因为你没有malloc它。

我相信free(ent);free(dir); 也是错误,因为这些函数将指针返回到由运行时库管理的内存中。一般来说,只在你 malloc'd 的东西上调用 free,或者函数的文档告诉你需要 free

【讨论】:

  • 但是我有一个问题,当我创建一个变量时,它并没有为 var 隐式分配内存,那为什么我不需要释放它呢?
  • 你只有freemalloc的东西。创建变量时,您会自动分配空间来存储该变量,并且在函数结束时自动释放该空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多