ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c – 将memcpy放入原始内存位置的向量中

2019-08-25 22:06:24  阅读:252  来源: 互联网

标签:c c11 stdvector wstring memcpy


我正在使用一个API,它在内存中提供了感兴趣的字符串的内存地址和长度.我想把这些字符串读成更友好的对象,比如wstring.

对于较小的字符串,使用以下代码可以很好地使用静态大小的缓冲区:

// This code works (but may have other issues)
// _stringLengthOffset and _bufferOffset are provided earlier by the API
// stringOID is the memory location of the string (and in terms of the API, the ObjectID)
DWORD stringLength;
memcpy(&stringLength, ((const void *)(stringOID + _stringLengthOffset)), sizeof(DWORD));
wchar_t argString[DEFAULT_ARGVALUE_BUFFER_SIZE];
memcpy(argString, ((const void *)(stringOID + _bufferOffset)), (stringLength) * sizeof(wchar_t));
argString[stringLength] = L'\0';  // Strings are not null terminated in memory
wstring argumentValue = argString;

我不认为创建一个非常非常大的静态大小缓冲区是个好主意(这些字符串可能有20,000个字符或更多.)我尝试了几种不同的方法,这些代码看起来很接近但不起作用.

// This code does NOT work. 
vector<wchar_t> buffer;
buffer.reserve( stringLength + 1 );
memcpy( &buffer[0], (const void *)(stringOID + _bufferOffset), (stringLength) * sizeof(wchar_t) );
buffer.push_back( L'\0' );
buffer.shrink_to_fit();
wstring argumentValue( buffer.begin(), buffer.end() );

问题:如果目标是创建一个wstring,那么如何从原始内存(由此特定API提供)正确复制到动态大小的缓冲区中,然后创建一个wstring?
(如果之前已经回答道歉,因为看起来像我之前的人会问过但我找不到合适的问题/答案,只需要几个小时的搜索.)

解决方法:

有很多方法.

1)使用resize而不是reserve并执行memcpy.也摆脱了收缩配合.

2)直接分配给字符串:

const wchar_t* pstr = reinterpret_cast<const wchar_t*>(stringOID + _bufferOffset);
wstring s(pstr, pstr + stringLength);
// or:
wstring s(pstr, stringLength);

选项2)避免复制并另外初始化调整大小的向量.

标签:c,c11,stdvector,wstring,memcpy
来源: https://codeday.me/bug/20190825/1723334.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有