保持对象活着的问题

时间:2013-02-13 20:37:53

标签: c++

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

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

片刻之后,这些存储的值被神奇地改变为包含一些随机垃圾。存储这些值的父对象始终在范围内,并且不会被破坏。可能导致这些值过早被擦除的原因是什么?

2 个答案:

答案 0 :(得分:1)

  

片刻之后,这些存储的值被神奇地改变为包含一些随机垃圾。

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

答案 1 :(得分:1)

pData中的数据是否已终止?如果不是,则strcpy中的rapi_strcpy呼叫可能会在结束时运行,因此复制超出目标中分配的大小。

您可能希望使用强制长度的内容,例如strncpymemcpy

strncpy(res->pData, rapistr.pData, rapistr.iDataLen);