لماذا أحصل على "فساد كومة"؟
-
27-09-2019 - |
سؤال
من فضلك لا تصلبني على هذا واحد. قررت أنه قد يكون من الجيد استخدام char* لأن السلسلة التي كنت أنوي بناءها كانت ذات حجم معروف. أدرك أيضًا أنه إذا قام TimeInfo-> tm_hour بإرجاع شيء آخر غير رقمين ، فستكون الأمور خاطئة بشكل سيء. ومع ذلك ، عندما تُرجع هذه الوظيفة ، فإن Visual Studio يذهب إلى وجهي حول فساد الكومة. ماذا يحدث؟ (أيضًا ، هل يجب أن أستخدم stringbuilder؟)
void cLogger::_writelogmessage(std::string Message)
{
time_t rawtime;
struct tm* timeinfo = 0;
time(&rawtime);
timeinfo = localtime(&rawtime);
char* MessageBuffer = new char[Message.length()+11];
char* msgptr = MessageBuffer;
_itoa(timeinfo->tm_hour, msgptr, 10);
msgptr+=2;
strcpy(msgptr, "::");
msgptr+=2;
_itoa(timeinfo->tm_min, msgptr, 10);
msgptr+=2;
strcpy(msgptr, "::");
msgptr+=2;
_itoa(timeinfo->tm_sec, msgptr, 10);
msgptr+=2;
strcpy(msgptr, " ");
msgptr+=1;
strcpy(msgptr, Message.c_str());
_file << MessageBuffer;
delete[] MessageBuffer;
}
المحلول
تحتاج إلى تخصيص بايت آخر ، منذ ذلك الحين .length
من string
يعيد طوله دون إنهاء NUL ، الذي تحتاجه أيضًا مساحة في char*
.
أي افترض Message.length()
إرجاع 10. يمكنك تخصيص 21 بايت. انسخ 11 بايت إلى المخزن المؤقت ، ثم انسخ الرسالة ، والتي تحتاج إلى 10 بايت + واحد لـ NUL. المجموع: 22 بايت ، وليس لديك فقط 21 تخصيص.
نصائح أخرى
هذه
char* MessageBuffer = new char[Message.length()+11];
يجب ان يكون
char* MessageBuffer = new char[Message.length()+12];
لأنك تضيف 11
char إضافي إلى المخزن المؤقت:
2 for hr
2 for ::
2 for min
2 for ::
2 for sec
1 for " "
تحتاج إلى واحد إضافي للإنهاء null
شار.
كما أشار آخرون ، حجم MessageBuffer
يحتاج إلى زيادة من قبل واحد.
ومع ذلك ، بدلاً من التعامل مع المخزن المؤقت Raw char بهذه الطريقة ، يمكنك فقط دفق معلومات الوقت مباشرة إلى _file
دون وضعها في سلسلة وسيطة أولا. إذا كنت تريدها في سلسلة وسيطة لسبب ما ، أقترح أن تستفيد من ostringstream
صف دراسي.
void writelogmessage(std::string Message)
{
time_t rawtime;
struct tm* timeinfo = 0;
time(&rawtime);
timeinfo = localtime(&rawtime);
std::ostringstream stream;
stream<<
timeinfo->tm_hour<<"::"<<
timeinfo->tm_min<<"::"<<
timeinfo->tm_sec<<" "<<
Message;
_file<<stream.str();
}