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

明らかな間違いの 1 つは、オブジェクト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 に答える