Возникли проблемы с инициализацией массива символов - PullRequest
3 голосов
/ 10 мая 2010

Хорошо, это домашнее задание по хеш-таблицам, но я думаю, что это простая вещь, которую я смог сделать с ранних классов, и я вырываю волосы. Профессор недостаточно отзывчив, поэтому я решил попробовать здесь.

У нас есть хеш-таблица складских объектов. Складские объекты создаются следующим образом:

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 ]

1 голос
/ 10 мая 2010

Во время вызова

должна быть какая-то проблема с параметром symbol

новый символ [strlen (символ) +1];

и strlen возвращают огромную длину, которую среда выполнения C ++ не может выделить. Если symbol неинициализирован char* указатель в начале, это вполне возможно. Разве он не терпит неудачу все время, не так ли?

1 голос
/ 10 мая 2010

Поскольку это тег C ++, вы можете использовать std::string вместо того, чтобы самостоятельно выполнять все операции по указателю на char*?

std::string name;
std::string symbol

Тогда setSymbol становится легким:

void stock::setSymbol(const char* symbol)  
{
    this->symbol = symbol;
}
0 голосов
/ 11 мая 2010

Спасибо всем, кто предложил помощь. Я прошел через это с моим профессором, и, к сожалению, раньше я переполнял массив и портил кучу, которая проявлялась здесь.

Это был хороший разговор для меня. Это помогло мне продумать некоторые вещи, которые я только что делал. Так что еще раз спасибо SO'ers

0 голосов
/ 10 мая 2010

Мне удалось без проблем запустить код на Cygwin, поэтому я предполагаю, что он зависит от реализации и отличает параметр symbol от члена symbol.

Вы говорите себе, что это сбивает с толку - ну, сделайте что-нибудь с этим !!! И я могу предложить, никогда больше никогда не называть параметр таким же, как локальная переменная / член. (Это не только устраняет путаницу, вам не нужно устранять неоднозначность с помощью this->.)

...