سؤال

من فضلك لا تصلبني على هذا واحد. قررت أنه قد يكون من الجيد استخدام 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top