gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:34:11 25 4
gpt4 key购买 nike

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

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 内存管理方法,内存不可读是没有意义的。也许这是我的代码中的一些错误,伙计们有什么想法吗?

最佳答案

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

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

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

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

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

关于c++ - 线程函数无法从堆上分配的缓冲区中读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com