线程函数无法从堆上分配的缓冲区中读取字符

Posted

技术标签:

【中文标题】线程函数无法从堆上分配的缓冲区中读取字符【英文标题】:thread functoin can't read char from buffer allocated on heap from 【发布时间】:2018-04-29 10:56:06 【问题描述】:

我有一个线程函数,创建一些称为数据槽的结构并将其传递给另一个需要填充数据槽数据的函数。 用数据填充数据槽后,我可以在相同的填充函数中打印数据,但是当返回线程函数时,它不能打印它,说“字符串中的无效字符”。这是线程函数代码:

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】:

您正在使用指向超出范围的缓冲区或本地字符串对象的指针覆盖指向已分配缓冲区的指针,并使d-&gt;RawData 带有悬空指针:

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

您可能应该将数据复制到分配的缓冲区:

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

您还需要确保释放为d-&gt;RawData 分配的缓冲区。

【讨论】:

以上是关于线程函数无法从堆上分配的缓冲区中读取字符的主要内容,如果未能解决你的问题,请参考以下文章

堆上分配的内存大小

在运行时在堆上分配缓冲区

C++ STL 问题:分配器

使用Monitor的Writer / Reader无法正常工作

JVM内存分配与回收

用于跨线程分配和免费的良好分配器