3

さて、これはハッシュテーブルに関する宿題ですが、これは私が以前のクラスでできたと思っていた単純なことであり、私は髪を引き裂いています。教授の反応が悪いので、ここでやってみようと思いました。

ストックオブジェクトのハッシュテーブルがあります。ストックオブジェクトは次のように作成されます。

stock("IBM", "International Business Machines", 2573, date(date::MAY, 23, 1967))

私のコンストラクターは次のようになります。

stock::stock(char const * const symbol, char const * const name, int sharePrice, date priceDate): m_symbol(NULL), m_name(NULL), sharePrice(sharePrice), dateOfPrice(priceDate)
{    
setSymbol(symbol);
setName(name);
}

setSymbolは次のようになります:(setNameは同一です):

void stock::setSymbol(const char* symbol)  
{  
if (m_symbol)  
    delete [] m_symbol;  
m_symbol = new char[strlen(symbol)+1];  
strcpy(m_symbol,symbol);  
}  

そしてそれはラインに割り当てることを拒否します

m_symbol = new char[strlen(symbol)+1];

std::bad_allocを使用します。名前と記号が宣言されています

char * m_name;  
char * m_symbol;

迷っているのは間違いなくstrlen()です。そして、それは毎回起こるわけではないようです。

cout << symbol << strlen(symbol); 

IBMを正しく返し、その後クラッシュする

4

4 に答える 4

1

これはC++とタグ付けstd::stringされているので、すべてのポインターのメンテナンスを自分で行う代わりに使用できますchar*か?

std::string name;
std::string symbol

その後、setSymbol簡単になります:

void stock::setSymbol(const char* symbol)  
{
    this->symbol = symbol;
}
于 2010-05-10T16:49:08.943 に答える
1

symbol電話をかけるときのパラメータに問題があるはずです

新しいchar[strlen(symbol)+1];

そしてstrlen、C++ランタイムが割り当てることができない巨大な長さを返します。symbolが最初に初期化されていないchar*ポインタである場合、これはかなり可能です。いつも失敗するわけではありませんよね?

于 2010-05-10T16:51:37.210 に答える
0

symbolCygwinで問題なくコードを実行できたので、パラメーターとメンバーを区別する上で、実装に依存するものだと思いますsymbol

あなたはそれが混乱しているとあなた自身に言います-よくそれについて何かをしてください!!! そして、二度と、パラメーターにローカル/メンバー変数と同じ名前を付けることをお勧めします。(混乱をなくすだけでなく、メンバー変数をで明確にする必要はありませんthis->。)

于 2010-05-10T17:29:00.550 に答える
0

助けてくれたみんなに感謝します。私は教授と一緒にそれを調べましたが、残念ながら、以前に配列をオーバーフローさせて、ここに現れていたヒープを破壊していました。

でもこれは私にとって良い会話でした。それは私が今やっていたいくつかのことを考えるのに役立ちました。だからもう一度ありがとうSO'ers

于 2010-05-11T19:59:08.613 に答える