Функция functoin не может прочитать символ из буфера, выделенного в куче из - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть функция потока, создающая некоторую структуру, называемую ячейкой данных, и передающая ее другой функции, которая должна заполнить данные ячейки данных. после заполнения ячейки данных данными я могу распечатать данные в той же функции заполнения, но при возврате к функции потока не может распечатать их, говоря «недопустимые символы в строке». это код функции потока:

unsigned __stdcall some_class::WriteBufferToFile(void * args) { 
    queue<wstring> * Q = (queue<wstring> *)args;
    myfile->open(ThisObj->DebugOutputPath, ios::out | ios::app | ios::binary);
    DataSlot * d = new DataSlot;
    ThisObj->ConvertCharactersToDataSlot(*Q, d);

    for (unsigned i = 0; i < d->Size; i++) { // printing doesn't works here !
        cout << d->RawData[i];
        *myfile << d->RawData[i];
    } 
    myfile->close();
    delete d;
    return 0;
    }

это код ConvertCharactersToDataSlot:

void some_class::ConvertCharactersToDataSlot(queue<wstring> ToConvert, DataSlot * d) {
    wstring CombineStr = L"";
    while (!ToConvert.empty()) {
        CombineStr += ToConvert.front();
        ToConvert.pop();
    }
    unsigned size = wcslen(CombineStr.c_str()) * sizeof(CombineStr[0]);
    d->Size = size;
    d->RawData = new BYTE[size];
    d->RawData = reinterpret_cast<BYTE *>(&CombineStr[0]);
    for (unsigned i = 0; i < d->Size; i++) { // printing works here !
        cout << d->RawData[i];
    }
}

Мне действительно нужно решить эту проблему, я не могу понять, почему это происходит, в соответствии с методами управления памятью OS это не имеет смысла, что память не читается. может быть, это какая-то ошибка в моем коде, какие-нибудь идеи, ребята?

1 Ответ

0 голосов
/ 29 апреля 2018

Вы перезаписываете указатель на выделенный буфер с указателем на буфер или локальный строковый объект, который выходит из области видимости и оставляет d->RawData с висящим указателем:

d->RawData = new BYTE[size];
d->RawData = reinterpret_cast<BYTE *>(&CombineStr[0]);

Вы, вероятно, должны скопировать данные в выделенный буфер вместо:

::memcpy(d->RawData, CombineStr.data(), size);

Вам также необходимо убедиться, что вы освободили буфер, выделенный для d->RawData.

...