2013-09-26 91 views
0

以下代码给我错误的g ++分配: std::bad_alloc what(): "St9bad_alloc"。我无法理解的原因,因为这是我加入到vector第一要素所以没有内存限制问题,应该是有std :: bad_alloc运行时错误g ++

#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; 
} 

感谢 鲁奇

回答

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

你在你的代码未定义行为。问题在于你创建了一个指针ss,但从不初始化它指向任何东西。这意味着它的价值是不确定的,并且是完全随机的。

要么声明它为非指针(我的建议),要么为它分配内存与new

0

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

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

然后尝试记住稍后删除它 – doctorlove