Storing/Retrieving 指向 char 数组中 std::wstring 的指针

Storing/Retrieving Pointer to std::wstring in char Array

我正在尝试了解有关 C++ 内存管理和类型转换的更多信息。如何在 char 数组中存储和检索 std::wstring*?关于阅读内容的代码或建议将不胜感激。

这是我到目前为止所尝试过的方法。我对 "Works" 的定义是正确的字符串出现在 GUI 控件中。 "Does not work" 表示它编译并运行但在 GUI 控件中给我一个空白。

我很好奇为什么 "Wrapper 2" 有效但 "Wrapper 1" 无效。

整数示例(有效):

int* lInt(new int);
*lInt = 1500000;
char lBuffer[sizeof(void*)];
memcpy(lBuffer, lInt, sizeof(void*));
int* lInt2 = (int*)lBuffer;
Memo->Lines->Append(IntToStr(*lInt2)); //C++Builder GUI control 
delete lInt;

std::wstring 示例(不起作用):

std::wstring* lMyString = new std::wstring();
*lMyString = L"My Name";
char lBuffer[sizeof(void*)];
memcpy(lBuffer, lMyString, sizeof(void*));
std::wstring* lMyString2 = (std::wstring*)lBuffer;
Memo->Lines->Append(lMyString2->c_str());  //C++Builder GUI control 
delete lMyString;

包装器 1(不起作用):

struct MyString
{
    std::wstring Text;
};
MyString* lMyString = new MyString();
lMyString->Text = L"My Name";
char lBuffer[sizeof(void*)];
memcpy(lBuffer, lMyString, sizeof(void*));
MyString* lMyString2 = (MyString*)lBuffer;
Memo->Lines->Append(lMyString2->Text.c_str());  //C++Builder GUI control 
delete lMyString;

包装器 2(有效):

struct MyString
{
    MyString(): Text(new std::wstring()){};
    ~MyString() {delete Text;};
    std::wstring* Text;
};
MyString* lMyString = new MyString();
*lMyString->Text = L"My Name";
char lBuffer[sizeof(void*)];
memcpy(lBuffer, lMyString, sizeof(void*));
MyString* lMyString2 = (MyString*)lBuffer;
Memo->Lines->Append(lMyString2->Text->c_str());  //C++Builder GUI control 
delete lMyString;

How can I store and retrieve a std::wstring* in a char array?

更好的方法是存储在void*:

std::wstring ws;
void *addr = &ws;
// ...
std::wstring retreived = *static_cast<std::wstring*>(addr);

***** std::wstring Example (Does not work) *****

std::wstring* lMyString = new std::wstring();
// ...
char lBuffer[sizeof(void*)];
memcpy(lBuffer, lMyString, sizeof(void*));
std::wstring* lMyString2 = (std::wstring*)lBuffer;
// ...

memcpy 使用这种方式实际上复制了存储的 std::wstring.

的字节
void* memcpy( void* dest, const void* src, std::size_t count );

lMyString 是指向已分配 std::wstring 的指针,memcpysrc 指向的内存中复制字节。你真正想做的是复制指针本身,所以你需要获取指针的地址:

memcpy(lBuffer, &lMyString, sizeof(void*));
 std::wstring* lMyString2 = (std::wstring*)lBuffer;

这也是错误的。您正在转换 char[] 中第一个字符的地址,而不是您之前存储在 char 数组中的实际字节。你应该 memcpy 回来:

std::wstring* lMyString2 = nullptr;
std::memcpy(&lMyString2, lBuffer, sizeof(void*));

正如我所说,请改用 void*