以下代码使用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;
}
由于 鲁奇
答案 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;