【发布时间】:2011-02-17 18:27:00
【问题描述】:
好的,这是关于哈希表的家庭作业,但这是我认为我在之前的课程中能够做到的简单事情,但我正在撕毁我的头发。教授反应不够快,所以我想我会在这里尝试。
我们有一个股票对象的哈希表。股票对象是这样创建的:
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,然后崩溃
【问题讨论】:
-
name和symbol是类变量,以及构造函数和setSymbol方法中的函数参数。可能有点混乱。
-
在失败的行之前执行
std::cout << strlen(symbol)。检查字符串长度值是否有意义。 -
您应该为您的成员变量采用命名约定。两个流行的是
memberVariable_和m_memberVariable。这样的约定将更容易区分参数名称和成员变量名称。 -
某些指针操作错误可能会导致“IBM”之后的终止
'\0\'被覆盖,从而导致虚假的 strlen 值。 -
您是否在定义自己的复制构造函数和赋值运算符?如果你不这样做,编译器生成的默认值将对你的成员变量执行浅拷贝(这不是你想要的)。见en.wikipedia.org/wiki/Object_copy、stackoverflow.com/questions/184710/…。
标签: c++ arrays pointers cstring