Я работаю с кодом :: Блоки с MinGW в Windows 7;C++ - вектор push_back() не работает после fgets()
У меня есть эта функция, которая работает отлично:
Hueso* getSkel(int cual)
{
unsigned int cont; //SkelCargados and CantSkel are global vectors
for (cont =0; cont < SkelCargados.size();cont++) if (CantSkel[cont] == cual) break; // EDIT: I changed <= with < before SkelCargados.size()
if (SkelCargados.empty() || cont>SkelCargados.size())
{
char linea[LINEA]; //LINEA is a macro. Max value for this string.
FILE * f = fopen("esqueletos.txt","rt");
if (f == NULL) return NULL;
fgets (linea,LINEA,f);
vector<float> puntos_; // <-- please pay attention in these 4 lines
puntos_.push_back(2.2);
puntos_.push_back(2.2);
puntos_.push_back(2.2);
while (!feof(f))
{
//...
}
fclose(f);
}
return SkelCargados[CantSkel[cont]];
}
И этот, что сбой при попытке 2-й push_back. Смешная вещь (НЕ) заключается в том, что когда я помещаю вектор и его push_back() s перед fgets, он ведет себя нормально.
EDIT: Если я объявляю вектор глобальной переменной, он отлично работает.
bool CargarMapa()
{
char linea[LINEA];
FILE * f = fopen("mapas.txt","rt");
if (f == NULL) return false;
fgets (linea,LINEA,f);
vector<float> puntos_;
puntos_.push_back(2.2);
puntos_.push_back(3); //Here it crashes
puntos_.push_back(4.2);
while (!feof(f))
{
//...
}
fclose(f);
return true;
}
Это то, что происходит, когда он выходит из строя: отладчик бросает «Программа получила сигнал SIGSEGV, неисправность Сегментация.» и переходит к строке, помеченной с «ЗДЕСЬ IT упорами» комментарий, в файле «new_allocator.h»:
//(I did not write the following comment)
/*
@brief An allocator that uses global new, as per [20.4].
@ingroup allocators
This is precisely the allocator defined in the C++ Standard.
- all allocation calls operator new
- all deallocation calls operator delete
*/
template<typename _Tp>
class new_allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template<typename _Tp1>
struct rebind
{ typedef new_allocator<_Tp1> other; };
new_allocator() throw() { }
new_allocator(const new_allocator&) throw() { }
template<typename _Tp1>
new_allocator(const new_allocator<_Tp1>&) throw() { }
~new_allocator() throw() { }
pointer
address(reference __x) const { return std::__addressof(__x); }
const_pointer
address(const_reference __x) const { return std::__addressof(__x); }
// NB: __n is permitted to be 0. The C++ standard says nothing
// about what the return value is when __n == 0.
pointer
allocate(size_type __n, const void* = 0)
{
if (__n > this->max_size())
std::__throw_bad_alloc();
return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); //HERE IT STOPS
}
Пожалуйста, помогите мне. :(
Я предполагаю, что это вопрос типа, попробуйте 'puntos_.push_back (3.0);' – Terkel
@Simon Банг Terkildsen это не проблема –
@DenisErmolin хорошо рад, что я не ставил на него деньги тогда :) – Terkel