在释放模式下访问时矢量大小为0
Vector size is 0 while accessing in Release mode
我有一个导出类的DLL
class EMUDIAG_CLIENT_DLL CEmuDiagnosticsDLL
{
//...
CProjectDataFB *m_pProjectData;
//...
};
class CProjectDataFB
{
//...
WORD m_wErrorCode;
vector<EmuComputerData> m_emuComputerData;
//...
};
struct EmuComputerData
{
DWORD dwEmuComputerNo;
WORD wAPVecSize;
DWORD dwIPAddress;
vector<DWORD> apNumbers;
};
DLL执行自己的操作来填充m_wErrorCode
和m_emuComputerData
。
我有一个EXE,其中包含CEmuDiagnosticsDLL
类的对象,并试图获得m_wErrorCode
和m_emuComputerData
。
在调试模式下,我得到值m_wErrorCode
和m_emuComputerData
正确。
在释放模式下,m_wErrorCode
的值是好的,但m_emuComputerData
的值总是0。
我不知道是什么导致这里的问题?
请不要在这里讨论类定义的语法/顺序,因为这是为了参考而提到的。
各种STL容器的大小(和内部结构)在调试版本和发布版本之间可能会有所不同,因为在调试版本中使用了额外的安全措施——特别是对于MS Visual c++,请参见此处的示例。
我怀疑你看到这种奇怪行为的原因是因为DLL和主要应用程序是用不同的配置(调试/发布)或_HAS_ITERATOR_DEBUGGING
宏的设置构建的(在链接的论坛线程中显示)。那么你可能很幸运地触发了这个"size似乎是0"的问题,它也可能简单地崩溃。
解决方案是始终保持EXE和DLL部分使用相同的配置构建(当然,MSVC的相同版本等——跨DLL边界传递c++对象并不容易),或者可能手动更改迭代器调试宏为您想要的值。
相关文章:
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 在将变量声明为引用时,堆在释放后使用
- 最小的CMake构建为Android
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 将"-01"替换为"-02" 英特尔编译器选项会导致 FPE 在较小的 for 循环行程计数中抛出
- Gtkmm 窗口为空白,不显示任何小部件或标题
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 如何将我的小程序转换为用于项目的函数?
- 将一个小的 C 定义重写为"normal" C++函数
- Qt:无法直接为带有子项的小部件添加滚动条
- 未分配被释放的指针(将堆栈实现为链表时)
- 将最小值整数转换为无符号长整型
- 如何从 css 资源为 gtkmm3 中的多个 glade 小部件设置主题
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 在QT中为小部件添加彩色边框的最佳方法是什么
- 如何将小端格式的QByteArray转换为无符号长整型
- AddressSanitizer 将 std::vector<T>::p ush_back 标识为释放后堆使用错误的原因
- 将unique_ptr转换为void*并返回,我需要释放吗
- 搜索一组点,其长度总和最小为矩形.算法是什么
- mmap小尺寸内存,当munmap为glibc时,会将映射内存释放到操作系统