初始化字符数组时遇到问题

时间:2010-05-10 16:38:11

标签: c++ arrays pointers cstring

好的,这是关于哈希表的功课,但这是我认为我能够从早期课程中做的简单的事情,而且我正在撕裂我的头发。教授反应不够,所以我想我会在这里试试。

我们有一个库存对象的哈希表。库存对象的创建如下:

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 个答案:

答案 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