2013-05-12 1 views
0

При чтении в файлах, это удобно выделить память с помощью вектора:Как убрать векторный контейнер и вернуть массив?

someType* readCSV() { 
    std::vector<someType> vec; 
    someType x; 
    ... 
    while(fscanf(f, parser, &x) != EOF) { 
     vec.push_back(x); 
     getc(f); // skip comma 
    } 
    return &vec[0]; 
} 

Но я просто хочу, чтобы вернуть нормальный массив (я работаю с CUDA после которого API использует указатели).

Итак, вопрос заключается в том, будет ли vec выйти из сферы действия в конце вызова функции, уничтожит содержащиеся в нем данные, и если есть что-нибудь, что я могу сохранить.

+0

Где находится 'vec'? – FDinoff

+1

Вы всегда можете выделить «вектор» вне 'readFile' и передать его в качестве аргумента по ссылке. –

+0

Правда, но это немного грязно в том смысле, что оно разрушает инкапсуляцию. Пользователи не должны знать, что функция реализована с использованием векторов. – mchen

ответ

0

Вы не можете выделить память в функции и не потерять ее без необходимости ее очистки после этого.

Вы можете обернуть функцию в класс, в котором хранится вектор. Затем вы можете вернуть указатель, и данные будут сохраняться.

class csvReader 
{ 
public: 
    csvReader (void) {} 
    type* readCSV (void) 
    { 
    type x; 
    while(fscanf(f, parser, &x) != EOF) { 
     vec.push_back(x); 
     getc(f); // skip comma 
    } 
    return vec.data(); 
    } 
private: 
    std::vector<type> vec; 
}; 
0

Да, в соответствии с тем, как вы его объявили, вектор выделяется на стеке, поэтому возвращаемая вами ссылка станет недействительной при выходе из сферы действия.

Вы можете иметь много решений:

  • проходит вектор в функцию, так что вызывающий абонент несет ответственность за ее распределение и открепление
  • использовать динамический массив (как someType *array = new someType[vec.size()] и вы будете нести ответственность в deallocating это через delete[] array
  • возвращающая вектор себя так, что она помещается в стек, а не освобождаться при выходе из функции (return vec)
+0

Что касается динамического массива, разве это не создаст новую память, полностью отделенную от вектора? – mchen