使对象保持活动状态时出现问题

Problems keeping objects alive

本文关键字:问题 活动状态 对象      更新时间:2023-10-16

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

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

过了一会儿,这些存储的值被神奇地改变,以包含一些随机垃圾。存储这些值的父对象始终在作用域内,并且不会销毁。什么可能导致这些值过早擦除?

pData NULL 中的数据是否终止? 否则,rapi_strcpy中的strcpy调用可能会在末端运行,因此复制超出了目标中分配的大小。

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

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

过了一会儿,这些存储的值被神奇地改变,以包含一些随机垃圾。

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