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
的指针,memcpy
从 src
指向的内存中复制字节。你真正想做的是复制指针本身,所以你需要获取指针的地址:
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*
。
我正在尝试了解有关 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
的指针,memcpy
从 src
指向的内存中复制字节。你真正想做的是复制指针本身,所以你需要获取指针的地址:
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*
。