好的,这是关于哈希表的功课,但这是我认为我能够从早期课程中做的简单的事情,而且我正在撕裂我的头发。教授反应不够,所以我想我会在这里试试。
我们有一个库存对象的哈希表。库存对象的创建如下:
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,然后崩溃
答案 0 :(得分:1)
由于这是标记的C ++,您可以使用std::string
而不是自己在char*
上执行所有指针维护吗?
std::string name;
std::string symbol
然后setSymbol
变得简单了:
void stock::setSymbol(const char* symbol)
{
this->symbol = symbol;
}
答案 1 :(得分:1)
在您致电时,symbol
参数必定存在问题
new char [strlen(symbol)+1];
和strlen
返回C ++运行时无法分配的巨大长度。如果symbol
在开头是未初始化的char*
指针,则这是相当可能的。它不会一直失败,是吗?
答案 2 :(得分:0)
我能够在Cygwin上运行代码而没有问题,所以我猜这是依赖于实现的,区分参数symbol
和成员symbol
。
你说你自己很困惑 - 好好做点什么!!!我可以建议,永远不要再次命名一个与本地/成员变量相同的参数。 (它不仅可以消除混淆,还不需要使用this->
消除成员变量的歧义。)
答案 3 :(得分:0)
感谢所有提供帮助的人。我和我的教授一起讨论了这个问题,不幸的是我早些时候已经溢出了一个数组并破坏了堆,这在这里很明显。
这对我来说是个很好的对话。它帮助我思考了我刚刚做过的一些事情。再次感谢SO'ers