请问内存问题?谢谢!

vagabondkq 2003-12-17 09:48:02
//头文件中定义
typedef struct _PER_IO_DATA
{
WSAOVERLAPPED ol;

char *buf; // Buffer
int buflen; // Length of the buffer

int operation; // Type of operation
#define OP_ACCEPT 0 // AcceptEx
#define OP_READ 1 // WSARecv/WSARecvFrom
#define OP_WRITE 2 // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;

//源文件中
lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));

运行到这里时debug看到lpPerIoData->ol的对应项显示:
WSAOVERLAPPED ol;
"CXX0030: Error: expression cannot be evaluated"
哪位帮忙看一下这是为什么呀?这问题已经困扰好长时间了。
谢谢!

...全文
41 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
vagabondkq 2003-12-20
  • 打赏
  • 举报
回复
不是我程序的错误,是VC的问题,可能是程序写的太大了,同样的代码添加到我的低版本工程中则没有问题,于是重新添了以遍就over了。实在搞不懂。
谢谢大家!
mldds 2003-12-17
  • 打赏
  • 举报
回复
可能是这时ol的内容没有意义,debug不能解析,可以先不管它,看看后面的代码运行如何。
vagabondkq 2003-12-17
  • 打赏
  • 举报
回复
以下是我这段程序的代码,接收网络连接并投递一个异步接收操作,出现了以上的问题
void CTreeDialog::OnAccept()
{
PER_HANDLE_DATA *PerHandleData = NULL;
LPPER_IO_DATA lpPerIoData;
SOCKADDR_IN saRemote;
SOCKET Accept;
int RemoteLen;

DWORD RecvBytes = 0;
DWORD Flags;

RemoteLen=sizeof(SOCKADDR_IN);

Accept=accept(m_sListen, (SOCKADDR*)&saRemote, &RemoteLen);
int i=WSAGetLastError();
if(Accept==INVALID_SOCKET) //若没接收到数据,函数返回
return;

//创建用来和套接字关联的单句柄数据信息结构
PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
PerHandleData->socket=Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);

//将接受套接字和完成端口关联起来
CreateIoCompletionPort((HANDLE)Accept, m_hCompletionPort, (DWORD)PerHandleData, 0);

m_nDvNum++; //设备总数++

//开始在接收套接字上处理I/O
//使用重叠I/O
WSABUF wbuf;
Flags = 0;

WSAEVENT Event;
char buffer[4096];

lpPerIoData = new _PER_IO_DATA; //!!!!

ZeroMemory(&(lpPerIoData->ol), sizeof(WSAOVERLAPPED));

Event = WSACreateEvent();
lpPerIoData->ol.hEvent = Event;

lpPerIoData->buflen=4096;
memcpy(buffer, &"", sizeof(buffer));
lpPerIoData->buf=buffer;

wbuf.len = lpPerIoData->buflen;
wbuf.buf = lpPerIoData->buf;

lpPerIoData->operation = OP_READ;

i = WSARecv(Accept,
&wbuf,
1,
(unsigned long *)&RecvBytes,
&Flags,
&(lpPerIoData->ol),
NULL);
i=WSAGetLastError();
delete lpPerIoData;
}
招财猫_Martin 2003-12-17
  • 打赏
  • 举报
回复
我是可以运行的呀,没有出现异常呀。
可以告诉我你的开发环境吗?
osborn 2003-12-17
  • 打赏
  • 举报
回复
代码没有问题。

你的程序是不是在dll中?

重新编译一下吧。
zhucde 2003-12-17
  • 打赏
  • 举报
回复
OVERLAPPED和WSAOVERLAPPED的大小是一样的,
------------------------------------------
这个我知道

我只是想看看你是怎么定义的.

单独看这段程序是看不出什么问题的,
楼主将代码贴详细一点

maskzha 2003-12-17
  • 打赏
  • 举报
回复
ZeroMemory(&(lpPerIoData->ol),sizeof(lpPerIoData->ol));

memset(&(lpPerIoData->ol),0,sizeof(OVERLAPPED));
vagabondkq 2003-12-17
  • 打赏
  • 举报
回复
两位:OVERLAPPED和WSAOVERLAPPED的大小是一样的,所以和这个也没关系,我试过将它们改成一样的也不行。
lpPerIoData我当然定义了,否则编译能通过吗?呵呵。
zhucde 2003-12-17
  • 打赏
  • 举报
回复
改成:
typedef struct _PER_IO_DATA
{
OVERLAPPED ol;
char *buf; // Buffer
int buflen; // Length of the buffer

int operation; // Type of operation
#define OP_ACCEPT 0 // AcceptEx
#define OP_READ 1 // WSARecv/WSARecvFrom
#define OP_WRITE 2 // WSASend/WSASendTo
} PER_IO_DATA, * LPPER_IO_DATA;


//源文件:

LPPER_IO_DATA lpPerIoData = new _PER_IO_DATA;
ZeroMemory(&(lpPerIoData->ol), sizeof(OVERLAPPED));


看看?
zhucde 2003-12-17
  • 打赏
  • 举报
回复
lpPerIoData 定义了吗?
怎么定义的?
popmental 2003-12-17
  • 打赏
  • 举报
回复
sizeof(OVERLAPPED)???????
vagabondkq 2003-12-17
  • 打赏
  • 举报
回复
我将ol以字符串输出:
AfxMessageBox((char*)&(lpPerIoData));
输出字符串不认识,但没有错误。
当运行到WSARecv()时,出现异常错误;将WSARecv()的倒数第二个参数&(lpPerIoData->ol)改写成NULL,则程序正常运行,但这样不是我想要的呀。
我实在是看不出来什么地方错了。
help!
osborn 2003-12-17
  • 打赏
  • 举报
回复
把ol内容输出为一个字符串,

确定是不能解析还是运行错误。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧