我正在 Windows 7 上使用 MinGW 使用 Code::Blocks;
我有这个工作正常的功能:
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]];
}
而这个,在尝试第二次 push_back 时崩溃。(不)有趣的是,当我将向量及其 push_back()s 放在 fgets 之前时,它的行为正常。
编辑:如果我将向量声明为全局变量,它也可以正常工作。
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,分段错误”。并转到文件“new_allocator.h”中标有“HERE IT STOPS”注释的行:
//(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
}
请帮我。:(