据我所知,C/C++ 中的近指针(或远指针)的地址值比 RAM 中的实际地址非常小。所以,如果我继续增加一个指针(比如 int 类型或任何对象类型指针),那么它会在特定值处翻转。现在,我的问题是:回滚它指向的值是否有效(假设我在内存中有大量数据)?
我知道这是一个奇怪的问题,但我有一种情况是我不断地分配和释放内存。我发现在特定点,由于地址值无效,例如
,0x20
二进制崩溃。0x45
0x10101
我想知道问题是由于指针值的翻转,并且由于地址由于指针而翻转,因此它显示无效地址并在访问时崩溃。
我希望我所指的情况与所提出的问题相似。即使它们不同,我也想知道两者的答案。我尝试搜索“连续递增指针”,但没有找到答案。
编辑:这是在 Red Hat linux 上用 G++ 4.1.2 20080704 (Red Hat 4.1.2-48) 编译的新代码。
实际上,代码非常大,可以共享。但我可以用文字来概括:有 3 个线程:
- 第一个线程:它创建分配 Alert 类对象并将其推送到队列中。
- 第二个线程:它从队列中读取警报,处理它。
- 第三个线程:它在处理 20-30 分钟后释放分配给 Alert 对象的内存。
我已经验证了第三个线程在第二个线程处理之前没有释放它。
但是由于警报是定期生成的(即每秒大约数千个),所以我怀疑主要问题中提到的问题。在我的实现中需要注意的一点:我正在使用 linux 管道队列将它从一个线程推送到另一个线程。为此,我只从发送方推送对象的地址值,并确保不会在那里删除对象。这是一种可能的腐败方式吗?以下是此特定任务的代码:
Alert* l_alert = new Alert(ADD_ACTION,
l_vehicleType,
l_vehicleNo,
l_projPolyline,
l_speed,
l_slotId);
m_ResultHandler->SendToWorker(&l_alert);
队列功能的实现:
S32 SendToWorker(queueDataType *p_instPtr)
{
S32 ret_val=SUCCESS;
QueueObj.Lock();
ret_val = QueueObj.Signal();
QueueObj.push(*p_instPtr);
QueueObj.UnLock();
return ret_val;
}
S32 GetFromReceiver(queueDataType *p_instPtr)
{
QueueObj.Lock();
while(QueueObj.size() == 0)
QueueObj.Wait();
*p_instPtr = QueueObj.front();
QueueObj.pop();
QueueObj.UnLock();
return SUCCESS;
}
接收端:
m_alertQueue->GetFromReceiver(&l_alert)