0

我遇到了一个奇怪的问题,对我来说没有任何意义。

我在定义如下的 API 上有一个结构(包含字符串):

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);

不久之后,这些存储的值被神奇地更改为包含一些随机垃圾。存储这些值的父对象一直在作用域内,并且不会被破坏。什么可能导致这些值过早地被擦除?

4

2 回答 2

2

NULL中的数据是否pData终止?如果不是,则strcpy调用rapi_strcpy可能会结束,因此复制超出了目标中分配的大小。

您可能想要使用强制长度的东西,例如strncpyor memcpy

strncpy(res->pData, rapistr.pData, rapistr.iDataLen);
于 2013-02-13T20:53:33.030 回答
0

不久之后,这些存储的值被神奇地更改为包含一些随机垃圾。

假设它stored_sNCharcb在退出时有效rapi_strcpy(),然后stored_sNCharcb在以后更改,这表明您未显示的代码在不stored_sNCharcb应该被覆盖时被覆盖,例如由于缓冲区溢出等。stored_sNCharcb我建议你在退出后放置一个数据断点rapi_strcpy(),然后让调试器告诉你它是否正在被修改,这样你就可以准确地看到哪些代码正在修改它。

于 2013-02-13T20:42:26.050 回答