Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
另一个C++;基于对象创建的奇怪分割错误 我最近在C++对象创建中遇到了一个问题。这个问题有点像讨论中的问题,但是这里的代码是开源项目的一部分,可能不容易出错_C++_Object - Fatal编程技术网

另一个C++;基于对象创建的奇怪分割错误 我最近在C++对象创建中遇到了一个问题。这个问题有点像讨论中的问题,但是这里的代码是开源项目的一部分,可能不容易出错

另一个C++;基于对象创建的奇怪分割错误 我最近在C++对象创建中遇到了一个问题。这个问题有点像讨论中的问题,但是这里的代码是开源项目的一部分,可能不容易出错,c++,object,C++,Object,对象创建在一个方法中调用,方法在两个连续步骤中调用 该类在strtokenizer.h中定义如下: class strtokenizer { protected: vector<string> tokens; int idx; public: strtokenizer(string str, string seperators = " "); void parse(string str, string s

对象创建在一个方法中调用,方法在两个连续步骤中调用

该类在strtokenizer.h中定义如下:

class strtokenizer {
    protected:
        vector<string> tokens;
        int idx;
    public:
        strtokenizer(string str, string seperators = " ");
        void parse(string str, string seperators);
        int count_tokens();
        string next_token();   
        void start_scan();
        string token(int i);
};
int dataset::read_wordmap(string wordmapfile, mapword2id * pword2id) {
    pword2id->clear();
    FILE * fin = fopen(wordmapfile.c_str(), "r");
    if (!fin) {
        printf("Cannot open file %s to read!\n", wordmapfile.c_str());
        return 1;
    }
    char buff[BUFF_SIZE_SHORT];
    string line;
    fgets(buff, BUFF_SIZE_SHORT - 1, fin);
    int nwords = atoi(buff);
    for (int i = 0; i < nwords; i++) {
        fgets(buff, BUFF_SIZE_SHORT - 1, fin);
        line = buff;
        strtokenizer strtok(line, " \t\r\n");
        if (strtok->count_tokens() != 2) {
            continue;
        }
        pword2id->insert(pair<string, int>(strtok->token(0), atoi(strtok->token(1).c_str())));
    }
fclose(fin);
return 0;
当对象创建的代码块修改如下时,将不会出现错误

strtokenizer *strtok = new strtokenizer(line, " \t\r\n");
printf("line: %s", line.c_str());
if (strtok->count_tokens() != 2) {
    continue;
}
pword2id->insert(pair<string, int>(strtok->token(0), atoi(strtok->token(1).c_str())));
strtokenizer*strtok=新的strtokenizer(行“\t\r\n”);
printf(“行:%s”,行.c_str());
如果(strtok->count_tokens()!=2){
继续;
}
pword2id->insert(配对(strtok->token(0),atoi(strtok->token(1.c_str()));

代码中似乎存在内存损坏。您应该考虑使用ValgReND()这样的工具来检查代码是否超出了界限。 修改后的代码使用堆内存而不是堆栈内存,这可能会隐藏问题(即使问题仍然存在)

通过阅读您的代码,有几个测试缺失,以确保在提供的
wordmapfile
中有一些意外数据时安全处理。
例如,您不检查fgets的结果,因此如果文件开头的字数大于实际字数,您将遇到问题。

我在@Paul R和其他朋友的建议下仔细调试了我的代码,发现这是因为我没有在堆栈中释放内存。 上面提出的代码是我项目的一小部分,在这个项目中,gibbs采样算法应该运行一千次(迭代)

在每次迭代中,旧的矩阵应该被释放,新的矩阵应该被“更新”。然而,我忘了释放所有的矩阵和列表,这就是为什么我的程序会崩溃

我在上面发布代码的原因是,程序每次遇到行时都会崩溃:

strtokenizer strtok(line, " \t\r\n");
strtokenizer strtok(line, " \t\r\n");
对象“strtok”将在文件中运行1000*行(10000+行)。所以我觉得可能创建的对象太多,占用了所有堆栈内存。即使我发现没有必要手动释放它们

在VisualStudio中调试程序时,内存占用监视器显示每次迭代中内存占用量都会急剧增加,并且“bad_alloc”错误时不时发生。这些让我意识到我忘记了释放一些大型动态矩阵

谢谢大家!
我为这个错误描述的问题道歉,这个问题占用了你的时间

欢迎来到堆栈溢出!听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:。谢谢你的建议。I 知道如何使用调试器,我还写了错误发生在哪一行。我需要提供更多的调试信息吗?当你发生崩溃时,理想情况下你应该做一个
bt
(回溯)并查看相关局部变量等的状态。@PaulR
bt
=>回溯??也用2个文件测试,每个95k行,没有问题。如果你在pastebin.com上发布你的输入文件,我可以查看。无论如何,我强烈建议为您的代码编写单元测试:)如果输入文件第一行中的数字大于输入文件中的行数,最后一行将多次插入pword2id。
strtokenizer strtok(line, " \t\r\n");