【问题标题】:Odd Memory Error -- Bad Alloc奇数内存错误——错误分配
【发布时间】:2010-01-16 20:39:58
【问题描述】:

处理 WinPCap 项目。尝试做一些基本的指针和内存操作,并有很多错误。

我已经包含了我试图与包含一起运行的两行。 另一个 VSC++ 项目中的相同行工作得很好。这是我得到的错误

在 0x75a79617 处未处理的异常 pktdump_ex.exe:微软 C++ 异常:内存中的 std::bad_alloc 位置 0x0012f8e4..

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include "DataTypes.h"
#include <sstream>

#include "EthernetLayer.h"

#include <pcap.h>

int* testPointer = new int[2];
delete[] testPointer;

编辑: 发现了一些有用的东西。 以下代码 sn -p 是导致 winpcap 库崩溃的原因。

EthernetStructPointers* testData;
testData = (EthernetStructPointers*)pkt_data;

EthernetStruct newData;
memcpy(newData.DEST_ADDRESS, testData->DEST_ADDRESS, 6);

这些是结构的定义。

struct EthernetStructPointers
{
    u_char DEST_ADDRESS[6];
    u_char SOURCE_ADDRESS[6];
    u_char TYPE[2];
};


struct EthernetStruct
{
    u_char DEST_ADDRESS[6];
    u_char SOURCE_ADDRESS[6];
    u_char TYPE[2];

    u_char* dataPointer;

    string DestAddress;
    string SourceAddress;
    string Type;

    int length;
};

【问题讨论】:

  • 这两行很好,这就是它们在其他程序中工作的原因。无论您的问题是什么,您都已将其从帖子中删除。我建议制作尽可能小的完整复制器并发布它。
  • 我会尝试发布代码,但需要有可用的 WinPCap。
  • 既然你有 MSVC,你有没有配置调试器在抛出的 C++ 异常时中断并验证上面的代码是原因?
  • 没有这些行我就不会出错。我这样做了,我很确定他们是原因。如果我在它们上设置断点并尝试跳过它,我会收到错误。
  • 附加调试器,转至调试 > 异常,然后单击 C++ 异常复选框。顺便说一句,当您在调试器中停止时,您可以打开任务管理器并查看您的进程的内存消耗量。

标签: c++ memory pointers


【解决方案1】:

我的猜测是 freestore 被前面的一个语句破坏了(可能是由于 pcap 接口的不正确使用),并且你只有在下一次内存分配或释放时才知道错误,当管理器检测到它并抛出一个错误的分配。

【讨论】:

  • 解决了这个问题。 :D 是我稍后在循环中尝试自己进行内存复制,而不是使用 memcpy。我很确定我做得对,但我猜不是。感谢大家的帮助!
【解决方案2】:

std::bad_alloc 应该在你尝试new 并且内存不足时抛出。你能检查你的进程有多少可用内存吗?

【讨论】:

  • 刚刚尝试运行以上几次。它两次收到数据包数据,然后因分配错误而崩溃。如何检查有多少可用内存?我正在运行带有 4 GB RAM 的 Windows 7。
  • 您能否打开任务管理器(Windows 7 中还有吗?),添加尽可能多的基于内存的列并重新运行测试?如果任何内存值飙升至大量,这可能是一个线索。
  • 发布产生问题的完整最小代码示例。很可能您已经损坏了堆或堆栈的某个与您显示的代码无关的地方。
猜你喜欢
  • 2018-05-26
  • 2016-10-29
  • 2023-03-17
  • 2012-11-27
  • 2010-12-08
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多