我遇到了一个对我没有任何意义的奇怪问题。
我在API上定义了一个struct(包含字符串),如下所示:
typedef struct sNCharcb
{
char * pData;
int iDataLen;
}
tsNCharcb;
我需要保存此结构的深层副本。我创建了一个实用程序函数来制作这个结构的副本:
inline sNCharcb rapi_strcpy(const sNCharcb &rapistr)
{
sNCharcb res;
res.pData = new char[rapistr.iDataLen];
strcpy(res.pData, rapistr.pData);
res.iDataLen = rapistr.iDataLen;
return res;
}
我使用此实用程序方法创建那些“sNCharcb”结构的副本,并将它们保存到父对象中的引用变量:
stored_sNCharcb = rapi_strcpy(sNCharcb_to_copy);
片刻之后,这些存储的值被神奇地改变为包含一些随机垃圾。存储这些值的父对象始终在范围内,并且不会被破坏。可能导致这些值过早被擦除的原因是什么?
答案 0 :(得分:1)
片刻之后,这些存储的值被神奇地改变为包含一些随机垃圾。
假设stored_sNCharcb
退出时rapi_strcpy()
有效,然后stored_sNCharcb
稍后更改,则表明您未显示的代码会覆盖stored_sNCharcb
时它不应该是,例如由于缓冲区溢出等。我建议您在stored_sNCharcb
退出后在rapi_strcpy()
上放置一个数据断点,然后让调试器告诉您它是否正在被修改,以便您可以确切地看到正在修改它的代码。
答案 1 :(得分:1)
pData
中的数据是否已终止?如果不是,则strcpy
中的rapi_strcpy
呼叫可能会在结束时运行,因此复制超出目标中分配的大小。
您可能希望使用强制长度的内容,例如strncpy
或memcpy
:
strncpy(res->pData, rapistr.pData, rapistr.iDataLen);