0

我正在 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
  }

请帮我。:(

4

2 回答 2

3
for (cont =0; cont<=SkelCargados.size();cont++) if ( CantSkel[cont] == cual) break;

不是你想要的。您可能想在循环终止条件中使用比较运算符<而不是。<=如所写,如果该向量中有一个项目,您最终可能会break获得 的索引1,这将导致您尝试索引到1只有一个位置的向量中的位置。(请记住,向量、数组和其他类似结构是零索引的,[0]第一个元素[1]也是如此,第二个元素也是如此,等等。)

该错误很可能不在于push_back它实际上对您失败的地方,而是代码中您破坏内存的其他地方(这会导致未定义的行为)。

于 2012-11-02T06:15:04.080 回答
0

看起来<=不正确

for (cont =0; cont<=SkelCargados.size();cont++) 
    if ( CantSkel[cont] == cual) break;

我认为应该是:

for (cont =0; cont<SkelCargados.size();cont++) 
    if ( CantSkel[cont] == cual) break;

还要确保在

return SkelCargados[CantSkel[cont]];

并且具有有效值contCantSkel[cont]

一个提示:如果索引错误,使用at()而不是[]then 你会得到一个out_of_range异常,使它更容易看到..

于 2012-11-02T06:15:00.900 回答