Проблема в том, что вы разыменовываете переменную cTime_ без фактического выделения памяти в первую очередь. Я не уверен, является ли это глобальной переменной или переменной-членом, но сначала вам нужно использовать оператор «new», чтобы выделить ее память. Таким образом, вы возвращаете указатель на (адрес) этой переменной обратно в вызывающую функцию, но как только эта функция завершается, она удаляет переменную «temp» и, следовательно, возвращенный указатель будет указывать на недопустимую память.
Решением будет использование оператора «new»:
string* Recipe::getCookingTime()
// @intput: none
// @output: cooking time as a string
{
string displayHrs;
string displayMins;
if( cookingTime_->numHours < 10 )
displayHrs = intToString(0) + intToString(cookingTime_->numHours );
else
displayHrs = intToString(cookingTime_->numHours );
if( cookingTime_->numMinutes < 10 )
displayMins = intToString(0) + intToString(cookingTime_->numMinutes);
else
displayMins = intToString(cookingTime_->numMinutes);
if( NULL == cTime_ )
{
cTime_ = new string();
}
*cTime_ = "The time to cook the recipe is " + displayHrs + ":" + displayMins;
return cTime_;
}
Тем не менее, я должен предупредить вас, что это не очень хороший дизайн, потому что здесь вы выделяете память и требуете, чтобы вызов знал, что он должен освободить ее, когда закончил с ней. Предпочтительным способом сделать это было бы сделать так, чтобы вызывающий объект выделил переменную и затем передал указатель:
bool Recipe::getCookingTime( string* str )
// @intput: none
// @output: cooking time as a string
{
if( NULL == str )
{
// Received invalid pointer
return false;
}
string displayHrs;
string displayMins;
if( cookingTime_->numHours < 10 )
displayHrs = intToString(0) + intToString(cookingTime_->numHours );
else
displayHrs = intToString(cookingTime_->numHours );
if( cookingTime_->numMinutes < 10 )
displayMins = intToString(0) + intToString(cookingTime_->numMinutes);
else
displayMins = intToString(cookingTime_->numMinutes);
*str = "The time to cook the recipe is " + displayHrs + ":" + displayMins;
return true;
}
Затем, когда абонент хочет использовать функцию, он может сделать это:
cTime_ = new string();
getCookingTime( cTime_ );
Резюме
Важно помнить, что вы должны выделить память, на которую ссылается указатель, прежде чем пытаться присвоить ему. Кроме того, обычно плохой дизайн - выделять память (используя оператор new) внутри функции, а не удалять ее явно. Кто бы ни выделял память, почти всегда должен быть тот, кто ее освобождает