2012-04-03 6 views
-1

にクラッシュ: "Chicago"--> ChicagoObj"NewYork"-->NewYorkObjChicagoObjNewYorkObjMyClassのオブジェクトへのポインタです。のstd ::マップは、Windows 32ビット上で動作しますが、私はそれで2つのエントリを持つ文字列マップ持って64

次のコードは32ビットでコンパイルして正常に動作しますが、64ビットでコンパイルされますが、シカゴのエントリを出力した後は常に64ビットでクラッシュします。どんな助けもありがとう!

typedef std::map<std::string, MyClass*> MyStringMap; 
MyStringMap my_map; 

std::string key1="Chicago"; 
MyClass *ChicagoObj = new MyClass; 
my_map[key1] = ChicagoObj; 

std::string key2="NewYork"; 
MyClass *NewYorkObj = new MyClass; 
my_map[key2] = NewYorkObj ; 

MyStringMap::iterator iObjMap = my_map.begin(); 

while (iObjMap != my_map.end()) 
{ 
    std::string key = iObjMap->first; 

    std::cout<<"name of the key in the map: " << key <<std::endl; 
    iObjMap++; 
} 
+1

"string"と "std :: string"を混在して使用していますが、私は誤植を想定しています。そうでなければ、 "string"は本当に "std :: string" – SirDarius

+3

'std :: string'のようなオブジェクト型を持つ' C'スタイルのキャストは使用しないでください。この場合でも無害に見えます。 – Chad

+0

このコードは実際にコンパイルされますか?それは、いくつかのものが欠けているようです。例えば、 "my_map"は何ですか? – josephthomas

答えて

0

最新のコードをコンパイルしておいて、以前のバグのあるプログラムを実行していませんか? Visual Studio 2010でWindows 7 64でコードをコンパイルしましたが、問題はありません。

コードにコンパイルエラーがありますが、std::outstd::coutである必要があります。しかしそれ以外には、/ Wallからの警告さえありません。

+0

「/ Wallからの警告もありません。それは事実ではない。標準ライブラリーヘッダー( ' 'のような)は/ Wallできれいにコンパイルされません。あなたは/ W4を意味しますか? –

+0

私は彼のコードから/ Wallを意味し、他のものは含みません。 – josephthomas

0

あなたは明らかに問題を実証するためのコードの完全な、コンパイル作品を投稿しませんので、ここではそれが動作する方法の短いデモです:

#include <map> 
#include <iostream> 
#include <string> 
#include <iterator> 

class City { 
    unsigned int population; 
    // probably more stuff here, but this should be enough for now. 
public: 
    City(int pop=0) : population(pop) {} 

    friend std::ostream &operator<<(std::ostream &os, City const &c) { 
     return os << c.population; 
    } 

}; 


std::ostream &operator<<(std::ostream &os, 
         std::pair<std::string, City> const &d) 
{ 
    return os << d.first << ": " << d.second; 
} 

int main() { 
    std::map<std::string, City> cities; 
    typedef std::pair<std::string, City> ct; 

    cities["Chicago"] = City(3456789); 
    cities["New York"] = City(8765432); 

    std::copy(cities.begin(), cities.end(), 
     std::ostream_iterator<ct>(std::cout, "\n")); 

    return 0; 
} 

私がコンパイルし、これを上のテストしてみた64それはちょうどうまくいくようです。 mapが問題なく64ビットWindowsで動作することは(少なくとも私にとって)表示されます。あなたが行った作業は、推測するのが難しいですが、うまくいかないコードで何が壊れているのか把握するよりも、作業コードを拡張して必要な作業を行う方が簡単かもしれません。

関連する問題