0

下面的代码给了我错误的 g++ 分配: 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;
}

谢谢鲁奇

4

3 回答 3

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;
  }
};
于 2013-09-26T08:37:19.620 回答
1

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

要么将其声明为非指针(我的建议),要么使用new.

于 2013-09-26T08:37:24.997 回答
0

您必须像这样初始化 ss 指针。

MyState* ss = new MyState();
/*
*
* Your Code
* 
*/
delete ss;
于 2013-09-26T08:40:48.207 回答