指针在发布版本中丢失
Pointer gets lost in the release build
问题如下:
有一个构造函数调用,其中指针是参数
m_pszBuf= new char[260];
//Still valid , to prove i'm printing the address
std::cout <<"Address "<< (void*)m_pszBuf <<std::endl;
device = new Device(m_pszBuf);
Device::Device(char* _ptr){
strcpy(dest,_ptr);
}
有趣的是,在调用构造函数之前,指针仍然是有效的,并且有地址和值,但是一旦它进入了actor,它就变成了一个坏指针(0x0000005c)。此外,它在调试模式下工作,而不是在发布模式下工作。
初始化m_pszBuf
:
m_pszBuf = new char[260];
然后像这样调用Device
构造函数:
device = new Device(m_pszBuf);
在Device
构造函数内部,有一个m_pszBuf
源的strcpy
调用:
Device::Device(char* _ptr) // _ptr == m_pszBuf
{
strcpy(dest, _ptr);
}
但是如果m_pszBuf
不是null终止的,strcpy
不会在分配的缓冲区结束时停止,它可以从越界内存中复制垃圾,并且可以溢出dest
缓冲区。
因此,在将m_pszBuf
传递给Device
构造函数之前,请确保它是以空结束的,并且strcpy
的目标指针足够大。
注意:此分析仅基于您展示的代码片段。(我不知道在你的实际代码中,你是否省略了显示其他问题。)
伟大的输入,但我已经解决了它与其他东西。我有一些头文件"不同步",用于库。我只需要更新它们。奇怪的是,这对其他事情的影响
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 从预处理器获取 Windows 版本(C++ Win32)
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- Visual Studio 2008版本内部版本未装饰DLL导出
- 哪个QT版本/内部版本更稳定