【发布时间】:2019-02-25 11:14:00
【问题描述】:
我有这种情况:
- 用 Visual C++ 编写的数据管理库,但在使用 Embarcadero CodeGear 编写的 C++ 程序中加载和使用
- 程序 LoadLibrary 和 GetProcAddress 中加载的库和函数
问题如下:
- 该库在 Visual C++ 测试环境中正常
- 由于stackoverflow异常使用相同的调用函数序列和相同的参数导致程序崩溃
库的简化代码:
struct TmRecordValue
{
UINT8 RecordValue[128];
};
struct TmRecord{
TmRecordValue RecordValues[2];
};
struct TmStruct
{
UINT32 NumberOfRecords;
TmRecord* Records;
};
void InitializeStruct(TmStruct* pStruct, int pNumberOfRecords)
{
memset(pStruct, 0, sizeof(TmStruct));
pStruct->NumberOfRecords = pNumberOfRecords;
pStruct->Records = new TmRecord[pStruct->NumberOfRecords];
memset(pStruct->Records, 0, sizeof(TmRecord) * pStruct->NumberOfRecords);
}
void AddRecordToStruct(TmStruct* pStruct, int pRecordIndex, char* pFirstValue, char* pSecondValue)
{
strcpy_s(reinterpret_cast<char*>(pStruct->Records[pRecordIndex].RecordValues[0].RecordValue), 128, pFirstValue);
strcpy_s(reinterpret_cast<char*>(pStruct->Records[pRecordIndex].RecordValues[1].RecordValue), 128, pSecondValue);
}
程序的简化代码:
TmStruct *struct1 = new TmStruct();
int RecordsQuantity = 100000;
InitializeStruct(struct1, RecordsQuantity);
for (int i = 0; i < RecordsQuantity; i++)
{
AddRecordToStruct(struct1, i, "first", "second");
}
评论:
- RecordsQuantity = {10, 100, 1000, 10000} 的程序运行正常,但在 100000 处崩溃
- 程序在 AddRecordToStruct 函数上抛出 stackoverflow 异常
- 程序总是在固定迭代中抛出 stackoverflow 异常 (#62643)
- 我没有看到递归行为,也没有大的堆栈变量(我会说一切都是动态分配的)
- 我会增加堆栈大小,但在我想检查 Visual C++ 测试环境的堆栈大小与实际运行程序的堆栈大小之前(但我不知道如何获取当前线程堆栈大小)
提前致谢,
【问题讨论】:
-
仔细看看
memset(pStruct->Records, 0, sizeof(TmStruct) * pStruct->NumberOfRecords);你确定要在那里使用sizeof(TmStruct)吗? -
对不起,我写的简化代码出错了,我已经编辑了问题;顺便说一句,仍然有同样的问题;现在谢谢
标签: c++ exception visual-c++ stack-overflow portability