[英]Correct way to deep copy std::string to char*
我應該使用哪種解決方案通過C ++中的dll邊界將std :: string的某些內容深度復制到char *?
memcpy(szValue, value.c_str(), value.size())
要么
strncpy_s(szValue, strlen(szValue), value.c_str(), value.length())
從外部調用的dll中的方法:
unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
// ...
}
我也嘗試過:
std::string value = m_xmlParser.GetNodeValue(propName);
std::vector<char> propValue(value.begin(), value.end());
propValue.push_back('\0');
szValue = &propValue[0];
但這只是一個淺表副本(離開dll后,char *數組為空)
memcpy和strncpy_s不是C ++函數,但是可以在這里使用嗎?
謝謝
如果我正確理解它,則嘗試以這種方式實現GetProp:
unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
std::string value = m_xmlParser.GetNodeValue(propName);
std::vector<char> propValue(value.begin(), value.end()); //propValue is on stack, mistake 1
propValue.push_back('\0');
szValue = &propValue[0];
}
在這行上szValue = &propValue[0];
您正在使szValue指向函數將返回時將被刪除的內存-錯誤2,最大的錯誤(3)是您正在修改局部變量-指向char的szValue指針是局部的...
unsigned int Interface::GetProp(const char* const szName, char* szValue)
{
std::string value = m_xmlParser.GetNodeValue(propName);
memcpy(szValue, value.c_str(), value.length()+1);
return ... whatever you want to ...
}
如何調用GetProp:
char buffer[MAX_SIZE_AS_PER_INTERFACE_API];
GetProp(propName, buffer);
unsigned int Interface::GetProp(const char* const szName, char* szValue)
只能使用指向某個接口API指定的最大大小的字符緩沖區的szValue
參數調用上述函數。 僅通過查看函數就無法知道該大小是多少...應該檢查文檔,因為希望在某個地方定義了一個常量。 正確的調用方式似乎是:
char buffer[MAX_SIZE_AS_PER_INTERFACE_API];
unsigned n = m_xmlParser.GetProp(propName, buffer);
也可能有一個單獨的函數來找出屬性值的長度,以便您可以事先創建一個已知足夠大的緩沖區。
在上面的代碼中, propName
可以是字符串文字,也可以是std::string
propName.c_str()
。
您還應該檢查API以查看返回的unsigned
值的含義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.