使对象保持活动状态时出现问题
Problems keeping objects alive
我遇到了一个对我来说没有任何意义的奇怪问题。
我在 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
调用可能会在末端运行,因此复制超出了目标中分配的大小。
您可能希望使用强制长度的东西,例如strncpy
或memcpy
:
strncpy(res->pData, rapistr.pData, rapistr.iDataLen);
过了一会儿,这些存储的值被神奇地改变,以包含一些随机垃圾。
假设stored_sNCharcb
在rapi_strcpy()
退出时有效,然后在以后stored_sNCharcb
更改,这表明您未显示的代码正在覆盖stored_sNCharcb
不应该覆盖的代码,例如由于缓冲区溢出等。 我建议您在rapi_strcpy()
退出后在stored_sNCharcb
上放置一个数据断点,然后让调试器告诉您它是否正在修改,以便您可以确切地看到哪个代码正在修改它。
相关文章:
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 在使用 gSoap 链接多个 SOAP 服务时启用保持活动状态
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 如何确定boost msm中的特定状态是否为活动状态
- GCC (libstdc++) 运行时如何在异常处于活动状态时决定终止 ()
- “B1的多重定义”,即使警卫处于活动状态
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 当 /Whorearchive选项处于活动状态时,无法使用Visual Studio链接到Windows上的自构建张量
- IBM Rhapsody c++ 代码生成 - 为什么总是在状态图周围放置一个活动状态
- 暂停游戏OnSteamVR叠加层处于活动状态
- 我怎么知道哪种上下文处于活动状态
- 如何使用QEvent::WindowBlocked,以便特定窗口始终处于活动状态?
- 如何保持异步函数中使用成员的shared_ptr对象的活动状态?
- 错误保持活动状态延迟
- 如何在C API中检查MySql连接是否处于活动状态
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 当条件处于活动状态时停止 arduino 循环
- 如何防止我的dll在某个进程未处于活动状态时运行
- 使对象保持活动状态时出现问题