在这个过程中,存储char*会在某个地方遭到破坏
Storing char* gets clobbered somewhere along the way
我有以下事件序列:
for(int i = 0; i < 4; i++)
{
int seqNum;
int ackNum;
int pldSize;
char* payload = (char*)malloc(DEFINED_SIZE);
//buffer updated each loop, assume: 140hello!
Packet::decap(buffer, seqNum, ackNum, pldSize, payload);
Packet p = Packet(seqNum, ackNum, pldSize, payload);
dataMap.insert(pair<int,struct Packet>(seqNum, p));
}
...
struct Packet
{
Packet(int,int,int,char*);
int seqNum;
int ackNum;
int payloadSize;
char* payload;
char* encap();
static void decap(char* datagram, int & seqn, int & ackn, int & bytes, char* pyld);
};
void
Packet::decap(char* datagram, int & seqn, int & ackn, int & bytes, char* pyld)
{
memcpy(&seqn, datagram, sizeof(int));
memcpy(&ackn, &datagram[4], sizeof(int));
memcpy(&bytes, &datagram[8], sizeof(int));
memcpy(pyld, &datagram[12], bytes);
}
Packet::Packet(int seq, int ack, int sz, char* pld)
{
seqNum = seq;
ackNum = ack;
payloadSize = sz;
memcpy(pld, &payload, sz);
}
...
map<int, struct Packet>::iterator dataIter = dataMap.begin();
while(dataIter != dataMap.end())
{
outfile.write(dataIter->second.payload, dataIter->second.payloadSize); //<<< Crash
dataIter++;
}
我不知道我在哪里复制/破坏了我的payload
内存。有人发现我漏掉了什么吗?
这一行似乎是罪魁祸首,
memcpy(pyld, &datagram[12], bytes);
打印本行前bytes
的值
c++ 11使用自动内存管理的例子:
typedef std::array<char, DEFINED_SIZE> packet_t;
typedef std::shared_ptr<packet_t> shared_packet_t;
for(int i = 0; i < 4; i++)
{
int seqNum;
int ackNum;
int pldSize;
// memory allocated here as new packet_t() but owned by shared_packet_t
shared_packet_t payload(new packet_t());
//buffer updated each loop, assume: 140hello!
Packet::decap(buffer, seqNum, ackNum, pldSize, payload);
// a second reference to packet_t exists in p
Packet p(seqNum, ackNum, pldSize, payload);
// a third reference to packet_t exists in a new copy of p that was created
// when pair<> was constructed
dataMap.insert(pair<int,struct Packet>(seqNum, p));
// payload and p are auto released here, but a reference to packet_t
// still exists via the reference to Packet in pair<> in the dataMap
}
struct Packet
{
Packet(int,int,int,shared_packet_t);
int seqNum;
int ackNum;
int payloadSize;
shared_packet_t payload;
char* encap();
static void decap(char* datagram, int & seqn, int & ackn, int & bytes, shared_packet_t pyld);
};
void
Packet::decap(char* datagram, int & seqn, int & ackn, int & bytes, shared_packet_t pyld)
{
memcpy(&seqn, datagram, sizeof(int));
memcpy(&ackn, &datagram[4], sizeof(int));
memcpy(&bytes, &datagram[8], sizeof(int));
memcpy(pyld->data(), &datagram[12], bytes);
}
Packet::Packet(int seq, int ack, int sz, shared_packet_t pld)
:seqNum(seq), ackNum(ack), payloadSize(sz), payload(pld)
{
}
...
map<int, struct Packet>::iterator dataIter = dataMap.begin();
while(dataIter != dataMap.end())
{
outfile.write(dataIter->second.payload->data(), dataIter->second.payloadSize);
dataIter++;
}
应该用c++ -std=c++11
memcpy(pld, &payload, sz);
我猜你想要这个…
payload = pld
相关文章:
- 是否删除在对象构造过程中创建的对象
- 如何在鼠标挂钩过程中检测拖动
- clang 插件:在编译过程中修改 AST
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- 线程过程中的线程同步问题
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- C++ 在编译过程中 strtok 函数 Eclipse 说没有在范围内声明?
- 在调用过程中删除 std::函数
- 动态矩阵特征分解过程中的误差
- cmake在构建过程中使用另一个工具检测标志
- 在模板参数推导过程中丢失限定符
- 升压过程中的管道缓冲区大小
- 如何在插入过程中更改插入的值
- 在PostgreSQL函数或过程中使用C++代码
- Vulkan:设备在缓冲区复制过程中丢失
- 如何解决导入dll过程中Viual Studio中的并排配置错误
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- Node中的子节点列表在C++中的BFS遍历过程中丢失
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- chrono::duration_cast在比率相乘过程中的问题