std :: bad_alloc g ++的运行时错误

时间:2013-09-26 08:35:48

标签: c++

以下代码使用g ++给出了错误的alloc:    std::bad_alloc what(): "St9bad_alloc"。我无法理解原因,因为这是我添加到vector的第一个元素,因此不存在内存限制问题

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class MyCity {
  string name;
  std::vector<pair<string,double> > neighbours;
public:
  MyCity(string s)
  {
    name =s;
    // neighbours.clear();
  }
  MyCity(string s, string s1, double d)
  {
    name = s;
    neighbours.push_back(std::make_pair(s1,d));
  }
};

class MyState {
  vector<MyCity*> cities;
  string name;
public:
  MyState() { }
  MyState(string s)
  {
    name =s;
  }
  bool add_city(string name, string neigh, double d)
  {
    MyCity* c = new MyCity(name,neigh,d);
    cities.push_back(c);
  }
  bool add_city(string name)
  {
    MyCity* c = new MyCity(name);
    cities.push_back(c);
    return true;
  }
};

int main()
{
  MyState* ss;
  ss->add_city("agra");
  return 0;
}

由于 鲁奇

3 个答案:

答案 0 :(得分:5)

一个明显的错误是ss没有指向MyState对象。它指向一个未确定的内存位置,您不应该写入该位置。您可以通过不首先使用指针来完全绕过该问题:

MyState ss;
ss.add_city("agra");

另请注意,MyState处理指向动态分配对象的指针。你必须要小心:目前你有内存泄漏。修复它时,您必须实现复制构造函数和赋值运算符(或禁用复制和赋值)。或者您可能决定根本不需要保留动态分配的对象,这将大大简化:

class MyState 
{
  std::vector<MyCity> cities; // look, no pointers
  ....
  bool add_city(const string& name, const string& neigh, double d)
  {
    cities.push_back(MyCity(name,neigh,d)); // can use emplace_back in C++11
    return true;
  }
};

答案 1 :(得分:1)

您的代码中有未定义的行为。问题在于您创建指针ss但从未将其初始化为指向任何内容。这意味着它的值是未定义的,并且将是完全随机的。

将其声明为非指针(我的推荐),或者使用new为其分配内存。

答案 2 :(得分:0)

你必须像那样初始化ss指针。

MyState* ss = new MyState();
/*
*
* Your Code
* 
*/
delete ss;