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调用时参数一定有问题

新字符[strlen(符号)+1];

strlen返回 C++ 运行时无法分配的巨大长度。如果在开头symbol是未初始化的指针,这是很有可能的。char*它不会一直失败,不是吗?

于 2010-05-10T16:51:37.210 回答
0

Thanks to everyone who offered help. I went over it with my professor, and unfortunately I was overflowing an array earlier and corrupting the heap, which was manifesting itself here.

This was a good conversation for me though. It helped me think through some things I had just been doing. So thanks again SO'ers

于 2010-05-11T19:59:08.613 回答
0

我能够在 Cygwin 上毫无问题地运行代码,所以我猜想它在区分参数symbol和成员时依赖于实现symbol

你自己说这很令人困惑——那就做点什么吧!!!我可以建议,永远不要再将参数命名为与本地/成员变量相同的名称。(它不仅消除了混淆,您不需要用 . 来消除成员变量的歧义this->。)

于 2010-05-10T17:29:00.550 回答