使用std :: string时出现分段错误

时间:2014-08-29 19:19:54

标签: c++ class struct segmentation-fault

我正在唱C ++来构建一个用于研究目的的csv处理器,并且在分段错误方面有一些麻烦。 该处理器将有一个主类(csvcontroller),它应该是当前文件的实例。该类控制两个结构。其中一个(CsvLine)是所有文件行的列表,另一个(CsvColumn)表示每个列表中所有列的列表。 当我尝试将列值写入结构时,我发生了分段错误,但只有在我使用字符串时才会发生。如果我们用int替换string,那么处理器就会以我想要的方式运行。

这是我的代码:

csvcontroller.h:

#ifndef CSVCONTROLLER_H
#define CSVCONTROLLER_H

#include <iostream>
#include <string>
using namespace std;


typedef struct CsvLine{

    struct CsvLine* next = NULL;
    struct CsvColumn* first = NULL;
    struct CsvColumn* last = NULL;
    struct CsvLine* previous = NULL;

};

typedef struct CsvColumn{

    struct CsvColumn* previous = NULL;
    string value = NULL;
    struct CsvColumn* next = NULL;

};


class csvcontroller{
    public:
        bool loadfile(string file_location,char separator);
        bool savefile(string file_location,char separator);
        CsvLine* getFirst();
        CsvLine* getLast();
        CsvLine* addLine();
        void addColumn(CsvLine* line,string* value);
        int getCount();
    protected:
        string path;
        CsvLine* first = NULL;
        CsvLine* last = NULL;
        int line_count;
    private:
};

#endif // CSVCONTROLLER_H

csvcontroller.cpp

#include "csvcontroller.h"
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <sstream>

using namespace std;

bool csvcontroller::loadfile(string file_location,char separator){

    this->path = file_location;
    const char * path = this->path.c_str();

    //Initializing read stream
    ifstream file;
    file.open(path);

    //Reading our file
    while(!file.eof()){

        string line;
        std::getline(file,line);
        stringstream stream(line);

        if(!line.empty()){

            string col;
            CsvLine* ln = this->addLine();

            while(std::getline(stream,col,separator)){
                this->addColumn(ln,&col);
            }

        }//if(!line.empty

    }//while(!file.eof())



    return false;
}

CsvLine* csvcontroller::addLine(){
    CsvLine* item = (CsvLine*) malloc(sizeof(CsvLine));

    if(this->first == NULL){

        this->first = item;
        this->last = item;

    }else{

        this->last->next = item;
        item->previous = this->last;
        this->last = item;

    }
}

void csvcontroller::addColumn(CsvLine* line,string* value){

    CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
    col->value = value;//Here's the problem

    if(line->first == NULL){

        line->first = col;
        line->last = col;

    }else{

        line->last->next = col;
        col->previous = line->last;
        line->last = col;

    }

}

/*
 *  GET & SET
 */

CsvLine* csvcontroller::getFirst(){
    return this->first;
}

CsvLine* csvcontroller::getLast(){
    return this->last;
}

main.cpp中:

#include <iostream>
#include <csvcontroller.h>

using namespace std;

int main(){

    csvcontroller lista_logradouros;
    lista_logradouros.loadfile("C:\\Users\\d786282\\Desktop\\Base_JUN_V2\\20140828_base_jun_padronizada.csv",';');
    CsvLine* aux = lista_logradouros.getFirst();
    do{
        aux = aux->next;
    }while(aux != NULL);


}

我如何调试/解决这个问题?

1 个答案:

答案 0 :(得分:1)

在你的标题'csvcontroller.h'中,你似乎已经像这样定义了CsvColumn类:

typedef struct CsvColumn{

    struct CsvColumn* previous = NULL;
    string value = NULL;
    struct CsvColumn* next = NULL;

};

但你所指派的是:

void csvcontroller::addColumn(CsvLine* line,string* value){

    CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
    col->value = value;

您正在尝试通过赋值运算符将指针指向std :: string转换为std :: string。您可以将您的指针deref以使操作成为副本:

col->value = *value;

或者你可以改变你的代码来获取字符串by-ref,而不是by-pointer(这是我建议的):

void csvcontroller::addColumn(CsvLine* line,const string& value){

    CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
    col->value = value;

显然这取决于您对申请的要求。

干杯!